有人可以解释一下这段代码中lambda运算符的用途是什么,它有什么作用?
public string HelloWorld
{
get { return _helloWorld; }
set { Set(() => HelloWorld, ref _helloWorld, value); }
}
Run Code Online (Sandbox Code Playgroud)
这是提取实现的成员名称的常见模式INotifyPropertyChanged.
通常,您希望使用更改的属性名称来引发PropertyChanged事件PropertyChangedEventArgs.问题是属性名称是一个字符串.因此,如果重命名该属性,则必须确保调整所有成员名称字符串.
为了避免这种情况,人们经常会实现一些Set表达式的方法,例如你的方法.然后,该方法使用表达式树来提取属性的成员名称.然后它使用名称来创建事件参数并为您引发事件.
你Set可能相当于以下的二传手:
set
{
if (_helloWorld != value)
{
_helloWorld = value;
OnPropertyChanged(new PropertyChangedEventArgs(this, "HelloWorld"));
}
}
Run Code Online (Sandbox Code Playgroud)
所有这些都封装在Set基本视图模型提供的方法中.
顺便说一句.使用.NET 4.5,您可以使用新的编译器服务来使这更简单..NET 4.5附带CallerMemberNameAttribute允许实现INotifyPropertyChanged提供自动获取属性名称的实用程序函数,因此您不必传递引用该属性的lambda表达式.此外,这个新功能在编译时进行评估,因此您获得与仅传递字符串时相同的性能,除了您不需要在任何地方指定该字符串,因此您可以安全地防止重构.
MVVM Light也提供此功能,您可以使用不同的重载Set来使用它.您的示例将如下所示:
Set(ref _helloWorld, value);
Run Code Online (Sandbox Code Playgroud)
使用C#6,您还可以使用new nameof运算符:nameof(HelloWorld)将"HelloWorld"在编译时替换.
| 归档时间: |
|
| 查看次数: |
419 次 |
| 最近记录: |