Pregunta

Entonces tengo lo siguiente:

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 DoSomething?

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

¿Fue útil?

Solución

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);

Otros consejos

Gran trabajo. Gracias.

Aquí está el mismo enfoque con una ligera modificación para los casos en los que uno no puede tener una 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);}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top