从MethodInfo创建委托

时间:2012-06-20 13:13:58

标签: c# delegates attributes methodinfo

我目前遇到了一个问题,试图从MethodInfo创建委托。我的总体目标是查看类中的方法并为标记有特定属性的方法创建委托。我正在尝试使用CreateDelegate,但我收到以下错误。

  

无法绑定到目标方法,因为其签名或安全透明度与委托类型的方法不兼容。

这是我的代码

public class TestClass
{
    public delegate void TestDelagate(string test);
    private List<TestDelagate> delagates = new List<TestDelagate>();

    public TestClass()
    {
        foreach (MethodInfo method in this.GetType().GetMethods())
        {
            if (TestAttribute.IsTest(method))
            {
                TestDelegate newDelegate = (TestDelagate)Delegate.CreateDelegate(typeof(TestDelagate), method);
                delegates.Add(newDelegate);
            }
        }
    }

    [Test]
    public void TestFunction(string test)
    {

    }
}

public class TestAttribute : Attribute
{
    public static bool IsTest(MemberInfo member)
    {
        bool isTestAttribute = false;

        foreach (object attribute in member.GetCustomAttributes(true))
        {
            if (attribute is TestAttribute)
                isTestAttribute = true;
        }

        return isTestAttribute;
    }
}

2 个答案:

答案 0 :(得分:53)

您正尝试从实例方法创建委托,但您没有传入目标。

您可以使用:

Delegate.CreateDelegate(typeof(TestDelagate), this, method);

...或者你可以让你的方法保持静态。

(如果您需要处理这两种方法,您需要有条件地执行此操作,或者将null作为中间参数传递。)

答案 1 :(得分:1)

如果委托没有目标,则需要不同的签名。目标需要作为第一个参数传递

public class TestClass
{
    public delegate void TestDelagate(TestClass instance, string test);
    private List<TestDelagate> delagates = new List<TestDelagate>();

    public TestClass()
    {
        foreach (MethodInfo method in this.GetType().GetMethods())
        {
            if (TestAttribute.IsTest(method))
            {
                TestDelegate newDelegate = (TestDelagate)Delegate.CreateDelegate(typeof(TestDelagate), null, method);
                delegates.Add(newDelegate);
                //Invocation:
                newDelegate.DynamicInvoke(this, "hello");

            }
        }
    }

    [Test]
    public void TestFunction(string test)
    {

    }
}