2010-08-02 14 views
28

Jak wywołać metodę statyczną z Type, zakładając, że znam wartość zmiennej Type i nazwę metody statycznej?Wywołanie metody statycznej przy użyciu typu

public class FooClass { 
    public static FooMethod() { 
     //do something 
    } 
} 

public class BarClass { 
    public void BarMethod(Type t) { 
     FooClass.FooMethod()   //works fine 
     if (t is FooClass) { 
      t.FooMethod();   //should call FooClass.FooMethod(); compile error 
     } 
    } 
} 

więc, biorąc pod uwagę Type t celem jest wywołanie FooMethod() na klasy, która ma Type t. Zasadniczo muszę odwrócić operatora typeof().

Odpowiedz

39

Trzeba zadzwonić MethodInfo.Invoke metody:

public class BarClass { 
    public void BarMethod(Type t) { 
     FooClass.FooMethod()   //works fine 
     if (t == typeof(FooClass)) { 
      t.GetMethod("FooMethod").Invoke(null, null); //null - means calling static method 
     } 
    } 
} 

Oczywiście w powyższym przykładzie równie dobrze można nazwać FooClass.FooMethod jak nie ma sensu przy użyciu odbicia za to. Poniższy przykładowy większy sens:

public class BarClass { 
    public void BarMethod(Type t, string method) { 
     var methodInfo = t.GetMethod(method); 
     if (methodInfo != null) { 
      methodInfo.Invoke(null, null); //null - means calling static method 
     } 
    } 
} 

public class Foo1Class { 
    static public Foo1Method(){} 
} 
public class Foo2Class { 
    static public Foo2Method(){} 
} 

//Usage 
new BarClass().BarMethod(typeof(Foo1Class), "Foo1Method"); 
new BarClass().BarMethod(typeof(Foo2Class), "Foo2Method");  
+0

Dzięki Igor, to działa dobrze (chociaż jestem rozczarowany w C# - wygląda na całkowicie niefasem) W moim rzeczywistym kodzie istnieje wiele klas, które mogą być w zmiennej Type, więc refleksja jest konieczna. – MrEff

2

sprawdzić w klasie MethodInfo i GetMethod() metody typu.

Istnieje wiele różnych przeciążeń w różnych sytuacjach.

Powiązane problemy