用反射调用静态委托
Calling static delegate with reflection
我需要使用反射调用委托方法,将方法名称作为字符串传递。
例如,我将传递 My.Controls.TestDelegate.myConverterAction
,其中 TestDelegate
是 class 名称,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
但我得到了一个空引用。
我该如何解决这个问题?
你的myConverterAction
是一个字段,不是一个方法。您可以将其更改为一种方法:
public static void MyConverterAction(object arg)
{
}
或者改用方法Type.GetField()
。
还有一件事:当您使用 BindingFlags.Instance
时,您无法捕获静态字段,也无法捕获方法。它仅限于实例(非静态)成员。请改用 BindingFlags.Static
。
由于 TestDelegate.myConverterAction
是静态 字段 而不是 方法 您应该使用以下代码检索它:
FieldInfo info = typeof(TestDelegate).GetField("myConverterAction", BindingFlags.Public | BindingFlags.Static);
object yourField = info.GetValue(null);
为了调用它,您需要使用以下方法获取它的调用方法:
MethodInfo method = yourField.GetType().GetMethod("Invoke");
并使用 MethodInfo.Invoke()
:
调用 Invoke
方法
method.Invoke(yourField, new {new object[]{"123"}});
我需要使用反射调用委托方法,将方法名称作为字符串传递。
例如,我将传递 My.Controls.TestDelegate.myConverterAction
,其中 TestDelegate
是 class 名称,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
但我得到了一个空引用。 我该如何解决这个问题?
你的myConverterAction
是一个字段,不是一个方法。您可以将其更改为一种方法:
public static void MyConverterAction(object arg)
{
}
或者改用方法Type.GetField()
。
还有一件事:当您使用 BindingFlags.Instance
时,您无法捕获静态字段,也无法捕获方法。它仅限于实例(非静态)成员。请改用 BindingFlags.Static
。
由于 TestDelegate.myConverterAction
是静态 字段 而不是 方法 您应该使用以下代码检索它:
FieldInfo info = typeof(TestDelegate).GetField("myConverterAction", BindingFlags.Public | BindingFlags.Static);
object yourField = info.GetValue(null);
为了调用它,您需要使用以下方法获取它的调用方法:
MethodInfo method = yourField.GetType().GetMethod("Invoke");
并使用 MethodInfo.Invoke()
:
Invoke
方法
method.Invoke(yourField, new {new object[]{"123"}});