有没有办法使用Action根据包含该方法名称的字符串值调用方法?

有帮助吗?

解决方案

Action< T> 只是一个可以指向给定方法的委托类型。如果要调用名称仅在运行时已知的方法,存储在字符串变量中,则需要使用反射:

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

根据@Andrew的建议,您可以使用Delegate.CreateDelegate从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");
    }
}

其他提示

我认为你真的不想要 Action< T> 只是常规方法。

public void CallMethod<T>(T instance, string methodName) { 
    MethodInfo method = typeof(T).GetMethod(methodName);
    if (method != null) {
        method.Invoke(instance, null);
    }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top