gpt4 book ai didi

c# - 避免在每个 setter 中调用 RaisePropertyChanged

转载 作者:行者123 更新时间:2023-11-30 13:48:06 26 4
gpt4 key购买 nike

我想摆脱模型类中占用空间且重复的 RaisePropertyChanged-Properties。我想要我的模型类...

public class ProductWorkItem : NotificationObject
{
private string name;
public string Name
{
get { return name; }
set {
if (value == name) return;
name = value; RaisePropertyChanged(() => Name);
}
}
private string description;
public string Description
{
get { return description; }
set {
if (value == description) return;
description = value; RaisePropertyChanged(() => Description);
}
}
private string brand;
public string Brand
{
get { return brand; }
set {
if (value == brand) return;
brand = value; RaisePropertyChanged(() => Brand);
}
}
}

...再次看起来如此简单:(但在属性更改时通知 View )

public class ProductWorkItem
{
public string Name{ get; set; }
public string Description{ get; set; }
public string Brand{ get; set; }
}

这可以通过某种代理类来实现吗?

我想避免为每个模型类编写代理。

最佳答案

我知道在“vanilla”C# 中没有简单且可维护的方法,但您可以使用 aspects 实现此目的 。我用过 PostSharp 为此,它有一个付费第三方产品的缺点,但有一个免费版本,您也可以在其中执行此操作。 PostSharp 利用了 attributes 的优势 如目标指定、继承等,并将它们扩展到方面。

然后您可以定义一个 LocationInterceptionAspect ,它会覆盖 OnSetValue调用您的方法 RaisePropertyChanged代表。然后您可以使用自动生成的属性,这些属性装饰有您的 aspect 属性。

PostSharp 的付费版本允许您在类级别执行此操作,因此您只需要一个属性(或者不需要,如果您修饰基类并将该属性定义为可继承的)。这是 described 在 PostSharp 网站上作为 InstanceLevelAspect 的用例

关于c# - 避免在每个 setter 中调用 RaisePropertyChanged,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13663719/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com