用反射调用静态委托

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"}});