我是 PostSharp 的新手,我想弄清楚它是否可以让我的生活更轻松地实现属性更改事件。 但是,我已经面临第一个问题。我在一个项目库 interfaces.dll 中有我的接口(interface):
public interface IPerson : INotifyPropertyChanged
{
string firstName { get; set; }
}
和另一个实现,implementations.dll:
[NotifyPropertyChanged] // Postsharp attribute
public class Person : IPerson
{
public string firstName { get; set; }
}
但是,这不会编译,因为 PostSharp 只会在编译后插入代码,因此在编译时缺少 INotifyPropertyChanged 实现,因此会因错误而中止。
我知道我可以在不依赖 INotifyPropertyChanged 的情况下设置接口(interface) IPerson,一切都会按预期工作,但这不是很糟糕的代码吗? 当然,我(或者更确切地说,postsharp)将在正确设置时自行实现 INotifyPropertyChanged 方法,但是没有正式定义 IPerson 必须实现它,因此可以在没有它的情况下创建一个实现,这将导致奇怪且可能难以追踪的错误。每当我想使用 INotifyPropertyChanged 方法时,我都必须明确地将 Person 转换为这种类型,而不能保证它确实实现了接口(interface)。
我也知道我可以自己在 Person 中实现 PropertyChanged 处理程序,而 PostSharp 至少会负责引发事件。但话又说回来,我使用 PostSharp 的唯一目的是自行管理所有这些,所以我必须自己重新开始编写一半的代码,我不确定它是否值得使用。
那你们是怎么处理的呢?对此有什么最佳做法吗?
最佳答案
如果您的类实现了 INotifyPropertyChange,那么 PostSharp 需要 OnPropertyChanged 出现在类中并期望您自己实现它。
编辑: OnPropertyChanged 的实现可能是这样的:
[NotifyPropertyChanged]
public class Person : IPerson
{
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
由于 CLI 限制,PostSharp 无法普遍引发事件。所以它必须使用这个解决方法。
NotifyPropertyChanged 也可以应用于接口(interface) - 所有接口(interface)实现都将实现 INotifyPropertyChanged:
[NotifyPropertyChanged]
public interface IPerson
...
public class Person : IPerson
...
不幸的是,您必须显式转换为 INotifyPropertyChange,但至少您可以以安全的方式执行此操作:
var person = new Person();
Post.Cast<Person, INotifyPropertyChanged>(person).PropertyChanged += ...
当 person 实例未实现 INotifyPropertyChanged 时将出现编译时错误,并且在实现时不会出现警告。
关于c# - PostSharp 和(应该)实现 INotifyPropertyChanged 的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25362102/