2017-01-24 5 views
0

Ich habe eine Funktion wieDeklarieren Delegierten mit ausgeschlossenen Parameter

public void foo(string st; bool x) 

Und ich habe es als Delegierter passieren auf diese Weise Eventhandler:

eventhndl += foo 

Aber braucht es 1 Parameter weniger.
Wie mache ich einen Delegierten ohne Parameter durch den Wert bereits erklärt es, wie (nicht funktioniert Art und Weise) erhalten hat:

eventhndl += foo(x=true) 

ohne sie Fehler mit ammount von params?

Antwort

3

können Sie einen Lambda verwenden Sie den Parameter wie folgt zu binden:

eventHandler += s => foo(s, true); 
+0

Funktioniert nicht mit diesem Fall arbeiten. "Der Delegat akzeptiert keine Argumente" – Hypixus

+0

@Hypixus Dann nimmt dieser Event-Handler im Gegensatz zu dem, was Sie in Ihrer Frage gesagt haben, kein Argument an. Sie müssen die anonyme Methode dem tatsächlichen Delegaten dieses Ereignisses anpassen. – Servy

+0

@Hypixus Nun, die Lösung würde alle Parameter übernehmen, z.B. 'eventHandler + = (str, x) => foo (str, wahr);' –

2

Einfache Antwort: Sie können nicht

Lange Antwort: Ein Delegierter stellt eine Funktion Unterschrift, so dass es genau die Funktion übereinstimmen müssen auf die die Instanz verweist.

Um dies zu lösen, die Sie auf die alte Weise auf C# für optionale Parameter verwenden können, Überlastungen:

void myFunction(bool a, bool b) 
{ 
} 

void myFunction(bool a) 
{ 
    myFunction(a, true); 
} 

delegate myDelegate(bool a); 
event myDelegate myEvent; 
//... 

myEvent += myFunction; 

Auf diese Weise können Sie auch die Überlastung an anderen Stellen des Codes verwenden können.

Oder wenn Sie mehr kurzen, aber weniger lesbaren Code bevorzugen, dann können Sie immer eine Lambda verwenden:

myEvent += (a) => myFunction(a, true); 
Verwandte Themen