2012-06-20 6 views
21

Ich stehe zur Zeit ein Problem beim Erstellen von Stellvertretern von MethodInfo. Mein übergeordnetes Ziel ist es, die Methoden einer Klasse durchzugehen und Delegaten für diejenigen zu erstellen, die mit einem bestimmten Attribut markiert sind. Ich versuche, CreateDelegate zu verwenden, aber ich erhalte den folgenden Fehler.Erstellen von Delegat von MethodInfo

Die Bindung an die Zielmethode ist nicht möglich, da ihre Signatur- oder Sicherheitstransparenz nicht mit der des Delegattyps kompatibel ist.

Hier ist mein 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; 
    } 
} 

Antwort

46

Sie versuchen, einen Delegaten aus einer Instanz Methode zu erstellen, aber Sie sind nicht in einem Ziel vorbei.

könnten Sie verwenden:

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

... oder Sie könnten Ihre Methode statisch machen.

(Wenn Sie mit beiden Arten von Verfahren bewältigen müssen, werden Sie, dass bedingt tun müssen, oder in null als mittleres Argument übergeben.)

+0

Macht Sinn, das funktioniert gut. Ich hatte die Beschreibung direkt nach dem Posten gelesen und sah, dass sie statische Funktion hatte. Danke, dass Sie darauf hingewiesen haben, wie es mit einer Instanz funktioniert. – thecaptain0220

0

Sie benötigen eine andere Signatur für die Delegierten, wenn es hat kein Ziel. Das Ziel muss als erstes Argument übergeben werden, dann

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

    } 
}