PostSharp& (应该)实现INotifyPropertyChanged的类

时间:2014-08-18 11:21:25

标签: c# postsharp

我是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只是为了自己管理所有这些,所以我必须自己再开始编写一半的东西,我不确定它是否值得使用

那你们怎么处理这个?对此有什么最好的做法吗?

2 个答案:

答案 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 ;控制台或服务器实现。