有没有办法使用 Action 来调用基于包含该方法名称的字符串值的方法?
问问题
157 次
2 回答
5
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");
}
}
于 2009-11-28T19:56:54.220 回答
2
我不认为你真的想要Action<T>
一个普通的方法。
public void CallMethod<T>(T instance, string methodName) {
MethodInfo method = typeof(T).GetMethod(methodName);
if (method != null) {
method.Invoke(instance, null);
}
}
于 2009-11-28T20:00:33.497 回答