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