2008-10-15 17 views
5

Así que tienen la siguiente:La invocación de un método que utiliza la reflexión sobre un objeto único

public class Singleton 
{ 

    private Singleton(){} 

    public static readonly Singleton instance = new Singleton(); 

    public string DoSomething(){ ... } 

    public string DoSomethingElse(){ ... } 

} 

Usando la reflexión ¿cómo puedo invocar el método HacerAlgo?

Motivo que pido es porque almaceno los nombres del método en XML y creo dinámicamente la UI. Por ejemplo, estoy creando dinámicamente un botón y diciéndole a qué método llamar mediante la reflexión cuando se hace clic en el botón. En algunos casos sería DoSomething o en otros sería DoSomethingElse.

Respuesta

11

no probado, pero debería funcionar ...

string methodName = "DoSomething"; // e.g. read from XML 
MethodInfo method = typeof(Singleton).GetMethod(methodName); 
FieldInfo field = typeof(Singleton).GetField("instance", 
    BindingFlags.Static | BindingFlags.Public); 
object instance = field.GetValue(null); 
method.Invoke(instance, Type.EmptyTypes); 
+0

great thankyou. Eso funciona. Excepto que no pude encontrar Types.Empty. ¿Te refieres Type.EmptyTypes? – Crippeoblade

4

gran trabajo. Gracias.

Este es el mismo enfoque con una ligera modificación para los casos en que no se puede hacer referencia al ensamblaje remoto. Solo necesitamos saber cosas básicas como el nombre completo de la clase (es decir, namespace.classname y la ruta al ensamblaje remoto).

static void Main(string[] args) 
    { 
     Assembly asm = null; 
     string assemblyPath = @"C:\works\...\StaticMembers.dll" 
     string classFullname = "StaticMembers.MySingleton"; 
     string doSomethingMethodName = "DoSomething"; 
     string doSomethingElseMethodName = "DoSomethingElse"; 

     asm = Assembly.LoadFrom(assemblyPath); 
     if (asm == null) 
      throw new FileNotFoundException(); 


     Type[] types = asm.GetTypes(); 
     Type theSingletonType = null; 
     foreach(Type ty in types) 
     { 
      if (ty.FullName.Equals(classFullname)) 
      { 
       theSingletonType = ty; 
       break; 
      } 
     } 
     if (theSingletonType == null) 
     { 
      Console.WriteLine("Type was not found!"); 
      return; 
     } 
     MethodInfo doSomethingMethodInfo = 
        theSingletonType.GetMethod(doSomethingMethodName); 


     FieldInfo field = theSingletonType.GetField("instance", 
          BindingFlags.Static | BindingFlags.Public); 

     object instance = field.GetValue(null); 

     string msg = (string)doSomethingMethodInfo.Invoke(instance, Type.EmptyTypes); 

     Console.WriteLine(msg); 

     MethodInfo somethingElse = theSingletonType.GetMethod(
             doSomethingElseMethodName); 
     msg = (string)doSomethingElse.Invoke(instance, Type.EmptyTypes); 
     Console.WriteLine(msg);} 
Cuestiones relacionadas