将函数名称传递给Func委托

时间:2016-07-08 11:50:26

标签: c# .net

我有一个非常具体的情况。我需要接受来自用户的函数名称并将此函数名称(我们已经知道此函数存在)传递给另一个处理函数调用的方法。此方法名为RunMethod,并且接受Func<string, string> method

我知道我可以使用类似的东西:

string methodName = "methodName";
MethodInfo mi = this.GetType().GetMethod(methodName);
mi.Invoke(this, null);

但在这种情况下,由于使用现有代码,我必须更改RunMethod方法及其不是选项

那么如何将字符串作为方法名称传递给另一个接受Func<string, string>的方法?

简化实施:

static void Main(string[] args)
{
    var pr = new Program();

    Console.WriteLine("Enter a method name: ");

    // user enters a method name
    string input = Console.ReadLine();

    // Can accept Method1 or Method2 as parameter
    // But we need to pass the "input"
    RunMethod(Method1);

    Console.WriteLine("Press any key to exit");
    Console.ReadKey();
}

static void RunMethod(Func<string, string> method)
{
    Console.WriteLine(method("John Doe"));
}

static string Method1(string name)
{
    return "method 1 called : " + name;
}

static string Method2(string name)
{
    return "method 2 called : " + name;
}

1 个答案:

答案 0 :(得分:6)

  

那么如何将字符串作为方法名称传递给另一个接受Func<string, string>的方法?

您不会 - 而是创建Func<string, string>。您可以使用Delegate.CreateDelegate

执行此操作
var method = GetType().GetMethod(...);
var func = (Func<string, string>) Delegate.CreateDelegate(
    typeof(Func<string, string>), method);
RunMethod(func);

请注意,这假设您已经弄清楚如何正确使用该方法 - 在您的示例代码中,您的方法是私有的,因此您需要将BindingFlags.Static | BindingFlags.NonPublic传递到{{1}调用。

完整示例:

GetMethod