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;
}
}
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.)
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)
{
}
}