2013-12-25 4 views
1
void doStuff(Object obj) 
{ 
    obj.method1(); 
} 

Этот код не компилируется, поскольку компилятор не может найти method1 в классе Object, но я знаю, что obj будет реализовывать этот метод. Я не могу передать объект, потому что я не знаю тип.Объект эталонный метод вызова

Это возможно в VB. Как я могу сделать это в C#?

+1

Возможно ли это в 'VB'? Прошло много времени с тех пор, как я использовал VB, но я серьезно сомневаюсь, что это возможно. Если это действительно возможно, тогда да. – Silvermind

+0

Да, безусловно, возможно. Я использую, когда пользовательский элемент управления использует метод вызова веб-службы. WS - это тип Object, и я просто вызываю метод. Is разрешен во время выполнения. – nachovall

ответ

4

Вы можете использовать отражение для get the type объекта, get the method и вызова это:

class SomeClass 
{ 
    public void method1() 
    { 
     Console.WriteLine("Method1() called"); 
    } 
} 

class Program 
{ 
    static void DoStuff(Object obj) 
    { 
     MethodInfo method = obj.GetType().GetMethod("method1"); 

     if(method != null) //check for null - that is returned if there is no method1 
      method.Invoke(obj, new Object[]{}); 
    } 
    static void Main(string[] args) 
    { 
     SomeClass someClass = new SomeClass(); 

     DoStuff(someClass); 
    } 
} 

LE: но для нас, чтобы дать лучшие советы, нам потребуется дополнительная информация о том, что вы пытаетесь достичь, так что вы можете рассмотреть интерфейс, который может быть лучшим решением, чем с помощью отражения.

+0

Похоже, что отражение было моим лучшим вариантом. Это сработало. Благодаря! – nachovall

2

Если вы не знаете, какой тип вы будете g'et затем использовать интерфейс и использовать этот интерфейс в качестве параметра вместо типа objext;)

Смежные вопросы