2012-05-12 13 views
6

Ich versuche, ein Objekt zu bauen, die System.ComponentModel.ISynchronizeInvoke verwendet, die das Verfahren aufweist: (ua)Hervorrufen System.Delegate Klasse Objekt in C#

public object Invoke(Delegate method, object[] args) 

Was ist der beste Weg, das nennen Methode mit den gegebenen Argumenten? Ich kann verwenden:

public object Invoke(Delegate method, object[] args) 
    { 
     return method.DynamicInvoke(args); 
    } 

Aber das ist spät gebunden. Mein Bauchgefühl ist, dass dies die einzige Möglichkeit ist, die Methode zu nennen. Irgendwelche Ideen?

+3

Beachten Sie, dass Sie ziemlich harte Versprechen machen, wenn Sie die Schnittstelle implementieren. Es wird erwartet, dass Sie * Code * synchronisieren. Konzentrieren Sie sich zuerst auf das Implementieren der InvokeRequired-Eigenschaft, das ist das Schwierige. –

Antwort

4

Ich denke, es ist logisch unmöglich, dass es anders geht. Der method Delegat kann eine Methode einer beliebigen Signatur kapseln (mit einer beliebigen Anzahl und einem beliebigen Typ von Parametern und einem beliebigen Rückgabewert oder void). Die einzige Möglichkeit, seine Signatur aufzulösen und sie mit den angegebenen Argumenten aufzurufen (nachdem überprüft wurde, dass sie die richtige Menge und den richtigen Typ aufweisen), würde zur Laufzeit durch Reflexion erfolgen.

Wenn Sie die Schnittstelle ISynchronizeInvoke nicht implementieren und Ihre eigene Methode definieren können, können Sie Ihr method-Argument darauf beschränken, nur Methodendelegaten einer bestimmten Signatur zu akzeptieren. In diesem Fall könnten Sie sie direkt aufrufen.

Zum Beispiel sind Verfahren auszuführen, die keine Parameter übernehmen und haben einen Rückgabewert, verwenden Sie:

public TResult Invoke<TResult>(Func<TResult> method) 
{ 
    return method(); 
} 

ein Verfahren auszuführen, die drei Parameter übernimmt und keinen Rückgabewert hat, verwenden Sie:

public void Invoke<T1,T2,T3>(Action<T1,T2,T3> method, T1 arg1, T2 arg2, T3 arg3) 
{ 
    method(arg1, arg2, arg3); 
} 
+0

Nach ein bisschen mehr Graben, das ist die Schlussfolgerung, zu der ich auch gekommen bin. Danke für die prägnante Antwort. – Rob