我需要使用反射调用委托方法,将方法的名称作为字符串传递。
例如,我会传递My.Controls.TestDelegate.myConverterAction
,其中TestDelegate
是类名,myConverterAction
是委托:
namespace My.Controls
{
public static class TestDelegate
{
public static CustomConversionHandler myConverterAction = new CustomConversionHandler(doSomething);
private static ulong doSomething(object[] values)
{
return 2;
}
}
}
我想以这种方式使用GetMethod()
方法:
int separator = actionDelegate.LastIndexOf('.');
string className = actionDelegate.Substring(0, separator);
string methodName = actionDelegate.Substring(separator + 1, actionDelegate.Length - className.Length - 1);
var t = Type.GetType(className); //This works
MethodInfo m = t.GetMethod(methodName, BindingFlags.Public | BindingFlags.Static); //This returns null...even with different BindingFlags options
但我获得了一个空引用。 我该如何解决这个问题?
答案 0 :(得分:4)
由于TestDelegate.myConverterAction
是静态字段而非方法,您应使用以下代码检索它:
FieldInfo info = typeof(TestDelegate).GetField("myConverterAction", BindingFlags.Public | BindingFlags.Static);
object yourField = info.GetValue(null);
为了调用它,你需要使用以下方法来调用它:
MethodInfo method = yourField.GetType().GetMethod("Invoke");
使用Invoke
调用MethodInfo.Invoke()
方法:
method.Invoke(yourField, new {new object[]{"123"}});
答案 1 :(得分:0)
您的myConverterAction
是字段,而不是方法。您可以将其更改为方法:
public static void MyConverterAction(object arg)
{
}
或者使用方法Type.GetField()
代替。
另一件事:当你使用BindingFlags.Instance
时,你无法捕获静态字段,也无法捕获方法。它仅限于实例(非静态)成员。请改用BindingFlags.Static
。