web-dev-qa-db-ja.com

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;
    }
}
26
thecaptain0220

instanceメソッドからデリゲートを作成しようとしていますが、ターゲットを渡していません。

あなたは使うことができます:

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

...または、メソッドを静的にすることができます。

(両方の種類のメソッドに対処する必要がある場合は、条件付きでそれを行うか、中央の引数としてnullを渡す必要があります。)

54
Jon Skeet

ターゲットがない場合は、デリゲートに別の署名が必要です。次にターゲットを最初の引数として渡す必要があります

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)
    {

    }
}
1
lidqy