web-dev-qa-db-fra.com

Créer un délégué à partir de MethodInfo

Je rencontre actuellement un problème en essayant de créer des délégués à partir de MethodInfo. Mon objectif général est de parcourir les méthodes d'une classe et de créer des délégués pour celles marquées avec un certain attribut. J'essaie d'utiliser CreateDelegate mais j'obtiens l'erreur suivante.

Impossible de se connecter à la méthode cible car sa signature ou sa transparence de sécurité n'est pas compatible avec celle du type délégué.

Voici mon code

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

Vous essayez de créer un délégué à partir d'une méthode instance , mais vous ne transmettez pas de cible.

Vous pouvez utiliser:

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

... ou vous pouvez rendre votre méthode statique.

(Si vous devez gérer les deux types de méthodes, vous devrez le faire de manière conditionnelle ou passer null comme argument intermédiaire.)

52
Jon Skeet

Vous avez besoin d'une signature différente pour le délégué, s'il n'a pas de cible. La cible doit être passée comme premier argument puis

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

    }
}
0
lidqy