Pergunta

Existe uma maneira de usar a ação para chamar um método com base em um valor de cadeia que contém o nome desse método?

Foi útil?

Solução

Action<T> é apenas um tipo delegado que poderia apontar para um determinado método. Se você quiser chamar um método cujo nome é conhecido apenas em tempo de execução, armazenado em uma variável string, você precisa ter que usar a reflexão:

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

Como sugerido por @ Andrew você poderia usar Delegate.CreateDelegate para criar um tipo de delegado de um 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");
    }
}

Outras dicas

Eu não acho que você realmente quer uma Action<T> apenas um método regular.

public void CallMethod<T>(T instance, string methodName) { 
    MethodInfo method = typeof(T).GetMethod(methodName);
    if (method != null) {
        method.Invoke(instance, null);
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top