2013-09-16 105 views
5

我看到PRISM声明下面的构造,我不知道那是什么“O”被与作为当基类的构造被称为第二个参数的lambda函数使用:lambda函数使用未知参数

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

我很感激一个解释。

+0

它只是一个输入参数未使用的谓语 - 在这种情况下,谓词总是返回true - 我怀疑是在情况下,默认的无谓语是通过 – BrokenGlass

+0

本[教程]。 (http://msdn.microsoft.com/en-us/library/vstudio/bb882516.aspx)将帮助您了解匿名方法和lambda。顺便说一句,它只是一个输入参数。 –

回答

3

它调用此构造函数:

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

传递一个lambda,它总是返回作为第二个参数

11

您发布调用,声明另一个构造函数构造真实的,所以要解释一下,我们应该先看看在另一个构造函数的签名:

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

所以第二个参数是一个Func<T, bool>。这意味着它是一个函数,它采用T类型的参数并返回一个布尔值。

现在,如果你看一下所使用的拉姆达:

(o) => true 

lambda表达式一般有语法(parameter-list) => lambda-body,所以在这种情况下,拉姆达的一个参数是一个变量o(哪种类型推断为T),该函数返回一个常数结果true

这样做的目的是基本上生成一个始终可执行的命令。

当然,lambda可能看起来更加复杂,因此使用DelegateCommand时,可能会使用更复杂和非常量的表达式。例如:

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

我知道lambda函数是什么,熟悉PRISM和这个基础构造函数(只要命令始终是activa就可以使用)。我刚才问了关于SYNTAX。你回答说:“在这种情况下,lambda的单个参数是变量o(哪种类型被推断为T)”,但我仍然不明白为什么“o”,因为单个参数已经被赋予名称为“executeMethod”。提前致谢! – Ofer

+1

@Ofer整个表达式'(o)=> true'的类型为'Func ',并且是构造函数参数'canExecuteMethod'的值。 'o'只是变量名称,在这种情况下可以自由选择,它采用'Func '参数的函数参数。你可以改为命名为'parameterToTheCanExecuteMethod':'(parameterToTheCanExecuteMethod)=> true'。如果它使得distrinction更清楚,你还可以添加额外的括号:'...:this(executeMethod,((parameterToTheCanExecuteMethod)=> true))''。 – poke