我是PostSharp的新手,我正在试图弄清楚它是否能让我的生活更容易实现属性更改事件。 但是,我已经面临第一个问题了。我的接口在一个项目库中,interfaces.dll:
public interface IPerson : INotifyPropertyChanged
{
string firstName { get; set; }
}
和另一个实现,implements.dll:
[NotifyPropertyChanged] // Postsharp attribute
public class Person : IPerson
{
public string firstName { get; set; }
}
但是,这不会编译为PostSharp,只有interjects是编译后的代码,因此在编译时缺少INotifyPropertyChanged实现,因此会中止错误。
我知道我可以设置接口IPerson而不依赖于INotifyPropertyChanged,一切都会按预期工作,但这不是很糟糕的代码吗? 当然,我(或者更确切地说,postharp)将在正确设置时自行实现INotifyPropertyChanged方法,但是没有正式的定义,IPerson必须实现这一点,因此有可能创建一个没有这个的实现,这将是导致奇数和可能难以追踪的错误。每当我想使用INotifyPropertyChanged方法时,我都必须将Person转换为expiclitly类型,而不保证它实际上实现了接口。
我也知道我可以自己在Person中实现PropertyChanged处理程序,而PostSharp至少会负责提升事件。但是我再一次使用PostSharp只是为了自己管理所有这些,所以我必须自己再开始编写一半的东西,我不确定它是否值得使用
那你们怎么处理这个?对此有什么最好的做法吗?
答案 0 :(得分:2)
如果你的类实现了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也可以应用于接口 - 所有接口实现都将实现INotifyPropertyChanged:
[NotifyPropertyChanged]
public interface IPerson
...
public class Person : IPerson
...
不幸的是你必须明确地转换为INotifyPropertyChange,但至少你可以安全地做到这一点:
var person = new Person();
Post.Cast<Person, INotifyPropertyChanged>(person).PropertyChanged += ...
当person实例没有实现INotifyPropertyChanged时会出现编译时错误,并且当它没有警告时会出现编译时错误。
答案 1 :(得分:1)
我认为在界面中不继承INotifyPropertyChanged
是不好的代码。相反,大多数时候我有一个数据接口,比如你的IPerson,然后是两到三个实现,其中至少有一个显式不实现INotifyPropertyChanged
,因为它&#39 ;控制台或服务器实现。