2013-04-10 2 views
7

Ich brauche eine beliebige Methode, um eine Funktion in der Lage sein myFunction weitergeben müssen:Wie übergebe ich eine beliebige Methode (oder Delegate) als Parameter an eine Funktion?

void myFunction(AnyFunc func) { ... } 

Es sollte möglich sein, sie mit anderen statisch, beispielsweise öffentliche oder private Methoden oder sogar Delegierten auszuführen:

myFunction(SomeClass.PublicStaticMethod); 
myFunction(SomeObject.PrivateInstanceMethod); 
myFunction(delegate(int x) { return 5*x; }); 

Die übergebene Methode kann eine beliebige Anzahl von Parametern und einen beliebigen Rückgabetyp haben. Es sollte auch möglich sein, die tatsächliche Anzahl von Parametern und deren Typen in myFunction über Reflexion zu lernen. Was wäre AnyFunc in der myFunction Definition, um solche Anforderungen zu erfüllen? Es ist zulässig, mehrere überladene Versionen des myFunction zu haben.

+0

Was erwarten Sie, wenn die Methode über Parameter verfügt? Es klingt so, als ob Sie die Methode in eine No-Parameter/Void-Rückgabe (auch als "Action" bezeichnet) konvertieren sollten, bevor Sie sie an diese Methode übergeben. – Servy

+0

'myFunction' analysiert Parameter der Funktion, prüft sie gegen eine externe Datenbank und ruft sie mit den notwendigen Werten auf oder schlägt fehl, wenn kein passender Eintrag in der Datenbank gefunden wird. –

+0

Das ist ein * sehr * besorgniserregendes Design, bei dem Sie Code im Grunde als Daten behandeln. Sie sollten in Betracht ziehen, dies so zu ändern, dass Ihr Code statisch ist. – Servy

Antwort

6

Der Delegate Typ ist die übergeordneter Typ von allen anderen Delegattypen:

void myFunction(Delegate func) { ... } 

Dann wird func.Method Sie geben ein MethodInfo Objekt, das Sie verwenden können, um den Rückgabetyp und die Parametertypen zu überprüfen.

beim Aufruf der Funktion werden Sie ausdrücklich Art von Delegaten angeben müssen, welche Sie erstellen möchten:

myFunction((Func<int, int>) delegate (int x) { return 5 * x; }); 

Eine Vorstellung von dem, was Sie versuchen, auf einem höheren Niveau als dies wäre gut, zu erreichen Ansatz kann sich nicht als ideal erweisen.

+0

Ich möchte die Aufrufseite so einfach wie möglich machen und die grellen Details in der Bibliothek verstecken. Gibt es eine Möglichkeit, die 'myFunction' anzugeben, damit Benutzer ihre Delegierten nicht umwandeln müssen? –

+1

@SergiyByelozyorov Die Aufrufseite kann möglicherweise nicht einfacher gemacht werden, da der Compiler * einen * konkreten Delegattyp benötigt, um eine Instanz von. Wenn Sie "einen beliebigen Delegattyp" akzeptieren möchten, muss der Aufrufer * einen Delegattyp selbst angeben.(Zum Beispiel, mit dem anonymen Delegaten 'delegate() {}', sowohl ['Action'] (http://msdn.microsoft.com/en-us/library/system.action.aspx) und [' ThreadStart' ] (http://msdn.microsoft.com/en-us/library/system.threading.threadstart.aspx) sind kompatible Delegattypen - wie ist der Compiler zu wissen, welche zu erstellen? – cdhowie

+0

Danke. Ich schätze, das ist meine Antwort. Das ist nicht möglich. Vielen Dank. –

0

Haben die Methode eine Delegate akzeptieren, anstatt einen bestimmten Delegierten:

void myFunction(Delegate func) 
{ 

} 
+0

Genau wie in der Antwort von cdhowie würde es erforderlich sein, den Delegaten auf einen bestimmten Delegattyp oder Func <...> zu übertragen. Ich möchte das vermeiden. –

+0

@SergiyByelozyorov Und wie er dir gesagt hat, ist das nicht möglich. – Servy