2013-09-16 8 views
5

Ich sehe PRISM den folgenden Konstruktor erklärt, und ich verstehe nicht, was ist das „o“ mit der Lambda-Funktion verwendet werden, die als zweiten Parameter dient, wenn der Basiskonstruktor heißt:Lambda-Funktion über Unknown Parameter

public DelegateCommand(Action<T> executeMethod) 
    : this(executeMethod, (o)=>true) 
{    
} 

Ich würde eine Erklärung schätzen.

+0

es ist nur ein Eingabeparameter auf ein Prädikat, das nicht verwendet wird - in diesem Fall das Prädikat immer true zurück - ich vermute, ist ein Standard für den Fall ist kein Prädikat in geben – BrokenGlass

+0

dieses [Tutorial]. (http://msdn.microsoft.com/en-us/library/vstudio/bb882516.aspx) wird Ihnen helfen, anonyme Methoden und Lambda zu verstehen. BTW ist nur ein Eingabeparameter. –

Antwort

3

Es diesen Konstruktor ruft:

DelegateCommand<T>(Action<T>, Func<T, Boolean>) 

einen Lambda-Pass, die immer wahr, wie der zweite Parameter gibt

11

Der Konstruktor, die Deklaration von Anrufen anderen Konstruktor geschrieben, so ist es zu erklären, sollten wir zuerst schauen bei der Unterschrift des anderen Konstruktor:

public DelegateCommand(Action<T> executeMethod, Func<T, bool> canExecuteMethod) 

So ist der zweite Parameter ist ein Func<T, bool>. Das bedeutet, dass es sich um eine Funktion handelt, die einen Parameter vom Typ T akzeptiert und einen booleschen Wert zurückgibt.

Nun, wenn Sie an dem Lambda aussehen, die verwendet wird:

(o) => true 

Lambdas im Allgemeinen hat die Syntax (parameter-list) => lambda-body, so dass in diesem Fall die einzelnen Parameter des Lambdas eine Variable o ist (welcher Typ abgeleitete ist zu sein T) und die Funktion gibt ein konstantes Ergebnis true zurück.

Der Zweck davon ist, grundsätzlich einen Befehl zu machen, der immer ausführbar ist.

Natürlich könnte Lambda viel komplizierter aussehen, wenn Sie den DelegateCommand verwenden, werden Sie wahrscheinlich komplexere und nicht konstante Ausdrücke verwenden. Zum Beispiel:

new DelegateCommand(DoSomething, o => o.SomeProperty >= 0 && o.SomeProperty < 10 && o.SomeBoolProperty) 
+0

Ich weiß, was Lambda-Funktionen sind, und bin vertraut mit PRISM und diesem Basiskonstruktor (der immer dann verwendet werden kann, wenn ein Befehl immer aktiviert ist). Ich habe nur nach dem SYNTAX gefragt. Sie antworteten mit den Worten: "In diesem Fall ist der einzelne Parameter des Lambda eine Variable o (welcher Typ ist T)", aber ich verstehe immer noch nicht warum "o", da der einzelne Parameter bereits gegeben wurde Name "executeMethod". Danke im Voraus! – Ofer

+1

@Ofer Der ganze Ausdruck '(o) => true' ist vom Typ' Func 'und ist der Wert für den Konstruktorparameter' canExecuteMethod'. "o" ist nur der in diesem Fall frei gewählte Variablenname, der das Funktionsargument des 'Func ' Parameters übernimmt. Man könnte es auch 'parameterToTheCanExecuteMethod' nennen:' (parameterToTheCanExecuteMethod) => true'. Wenn es die Auflösung klarer macht, können Sie auch zusätzliche Klammern hinzufügen: '...: this (executeMethod, ((parameterToTheCanExecuteMethod) => true))'. – poke