Pregunta

¿Hay alguna manera de usar Action para llamar a un método basado en un valor de cadena que contiene el nombre de ese método?

¿Fue útil?

Solución

Action < T > es solo un tipo de delegado que podría apuntar a un método dado. Si desea llamar a un método cuyo nombre solo se conoce en tiempo de ejecución, almacenado en una variable de cadena, debe usar la reflexión:

class Program
{
    static void Main(string[] args)
    {
        string nameOfTheMethodToCall = "Test";
        typeof(Program).InvokeMember(
            nameOfTheMethodToCall, 
            BindingFlags.NonPublic | BindingFlags.InvokeMethod | BindingFlags.Static, 
            null, 
            null, 
            null);
    }

    static void Test()
    {
        Console.WriteLine("Hello from Test method");
    }
}

Según lo sugerido por @Andrew, podría usar Delegate.CreateDelegate para crear un tipo de delegado a partir de MethodInfo:

class Program
{
    static void Main(string[] args)
    {
        string nameOfTheMethodToCall = "Test";
        var mi = typeof(Program).GetMethod(nameOfTheMethodToCall, BindingFlags.NonPublic | BindingFlags.InvokeMethod | BindingFlags.Static);
        var del = (Action)Delegate.CreateDelegate(typeof(Action), mi);
        del();
    }

    static void Test()
    {
        Console.WriteLine("Hello from Test method");
    }
}

Otros consejos

No creo que realmente quieras una Acción < T > solo un método normal.

public void CallMethod<T>(T instance, string methodName) { 
    MethodInfo method = typeof(T).GetMethod(methodName);
    if (method != null) {
        method.Invoke(instance, null);
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top