2010-08-02 21 views
28

¿Cómo llamo a un método estático de Type, suponiendo que sé el valor de la variable Type y el nombre del método estático?Llamar a un método estático utilizando un tipo

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 
     } 
    } 
} 

Así, dado un Type t, el objetivo es llamar FooMethod() de la clase que es de Type t. Básicamente necesito invertir el operador typeof().

Respuesta

39

es necesario llamar a MethodInfo.Invoke método:

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 
     } 
    } 
} 

Por supuesto que en el ejemplo anterior que también podría llamar FooClass.FooMethod ya que no hay punto de reflexión usando para ello. El siguiente ejemplo tiene más sentido:

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

Gracias Igor, esto funcionará bien (aunque estoy decepcionado con C# - parece completamente inseguro) En mi código actual hay muchas clases que podrían estar en la variable Tipo, por lo que es necesario reflexionar. – MrEff

2

comprobar en la clase MethodInfo y los métodos GetMethod() del tipo.

Existen varias sobrecargas diferentes para diferentes situaciones.

Cuestiones relacionadas