用反射调用静态委托

时间:2015-09-21 09:42:10

标签: c# reflection delegates

我需要使用反射调用委托方法,将方法的名称作为字符串传递。

例如,我会传递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

但我获得了一个空引用。 我该如何解决这个问题?

2 个答案:

答案 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