通过利用EqualityComparer.Default您可以向下降低属性setter代码一行如下:
private int unitsInStock;
public int UnitsInStock
{
get { return unitsInStock; }
set { SetProperty(ref unitsInStock, value, "UnitsInStock"); }
}
public event PropertyChangedEventHandler PropertyChanged;
protected void SetProperty<T>(ref T field, T value, string name)
{
if (!EqualityComparer<T>.Default.Equals(field, value))
{
field = value;
var handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
}
}
如果您的视图模型从一个基类,定义了SetProperty
方法和PropertyChanged
事件,那么量继承在您的子视图模型中支持INotifyPropertyChanged所需的代码变得非常少(1行)。
这种方法比其他答案中提到的代码编织方法更详细,但不要求您修改构建过程来完成它。
一定要看看即将推出C# 5 Caller Info attributes以及它看起来像他们将允许我们避免在方法中使用魔术字符串,没有反射的性能成本。
更新(2012年3月1日):
的.NET 4.5 Beta版已经出来了,有了它,你可以进一步细化上面的代码本,其免除了在呼叫者的字符串字面量的需要:
private int unitsInStock;
public int UnitsInStock
{
get { return unitsInStock; }
set
{
SetProperty(ref unitsInStock, value);
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void SetProperty<T>(ref T field, T value, [CallerMemberName] string name = "")
{
if (!EqualityComparer<T>.Default.Equals(field, value))
{
field = value;
var handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
}
}
我有一个blog post,稍微更详细地谈论它。
你确定这是链接到Postsharp。看起来他们似乎没有为C#提供任何工具。 – Vaccano 2010-10-03 19:10:42
哎呀,对不起,坏的链接...我修好了它 – 2010-10-03 19:12:36
这看起来很酷,但它必须在商业版本(或比它看起来更难)。我无法使它与Community Edition一起工作。 – Vaccano 2010-10-03 20:02:58