2016-07-01 16 views
2

Ich versuche Delegationen zu verstehen, so habe ich nur kleine Versuch Projekt geschrieben; Ich habe Klasse D:C# Reflection Delegate Ausnahme: Muss von Delegat

class D 
{ 
    private static void Func1(Object o) 
    { 
     if (!(o is string)) return; 
     string s = o as string; 
     Console.WriteLine("Func1 going to sleep"); 
     Thread.Sleep(1500); 
     Console.WriteLine("Func1: " + s); 
    } 
} 

und im Haupt im mit:

MethodInfo inf = typeof(D).GetMethod("Func1", BindingFlags.NonPublic | BindingFlags.Static); 
Delegate d = Delegate.CreateDelegate(typeof(D), inf); 

Die Methode info bekommt die richtigen Informationen, aber die CreateDelegate Methode löst eine Ausnahme, saybg, dass die Art von Delegierten ableiten müssen .

Wie kann ich das lösen?

+0

Nun ja ... Sie können CreateDelegate nur aufrufen, um Instanzen von Delegaten zu erstellen. Was haben Sie von diesem Code erwartet? –

Antwort

5

Wenn Sie einen Delegaten für die Methode Func1 erstellen möchten, müssen Sie den Typ des Delegaten angeben, den Sie erstellen möchten. In diesem Fall können Sie Action<object> verwenden:

MethodInfo inf = typeof(D).GetMethod("Func1", BindingFlags.NonPublic | BindingFlags.Static); 
Delegate d = Delegate.CreateDelegate(typeof(Action<object>), inf); 
+0

Danke! Es funktioniert – Erez

0

Der Typ Sie CreateDelegate Methode übergeben nicht wirklich Typ der Klasse, aber Typ der Funktion, die Sie die Methode aufzurufen verwenden wird. Daher wird es Delegattyp mit den gleichen Argumenten wie die ursprüngliche Methode sein:

public delegate void MyDelegate(Object o); 
... 
MethodInfo inf = typeof(D).GetMethod("Func1", BindingFlags.NonPublic | BindingFlags.Static); 
Delegate d = Delegate.CreateDelegate(typeof(MyDelegate), inf);