我有一个非常具体的情况。我需要接受来自用户的函数名称并将此函数名称(我们已经知道此函数存在)传递给另一个处理函数调用的方法。此方法名为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;
}
答案 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