PostSharp,类(应该)实现INotifyPropertyChanged

本文关键字:实现 INotifyPropertyChanged 应该 PostSharp | 更新日期: 2023-09-27 18:18:33

我是PostSharp的新手,我想弄清楚它是否能让我的生活实现属性改变事件更容易一点。然而,我已经面临第一个问题了。我有我的接口在一个项目库,接口。dll:

public interface IPerson : INotifyPropertyChanged
{
  string firstName { get; set; }
}

和实现在另一个,implementation .dll:

[NotifyPropertyChanged] // Postsharp attribute
public class Person : IPerson
{
  public string firstName { get; set; }
}

然而,这不会编译为PostSharp只在编译后插入代码,因此INotifyPropertyChanged实现在编译时丢失,因此,它以错误终止。

我知道我可以只是设置接口IPerson不依赖于INotifyPropertyChanged,一切都会按预期工作,但这不是很糟糕的代码吗?当然,当设置正确时,我(或者更确切地说,postsharp)将自己实现INotifyPropertyChanged方法,但是没有正式的定义IPerson必须实现这个,所以可以创建一个没有这个的实现,这将导致奇怪的和潜在的难以跟踪的错误。每当我想使用INotifyPropertyChanged方法时,我必须显式地将Person转换为这种类型,而不保证它确实实现了接口。

我也知道我可以自己在Person中实现PropertyChanged处理程序,而PostSharp至少会负责引发事件。但是,我使用PostSharp的唯一目的是自己管理所有这些东西,所以如果我不得不自己开始编写一半的东西,我不确定它是否值得使用。

那你们是怎么处理的呢?这方面有什么最佳实践吗?

PostSharp,类(应该)实现INotifyPropertyChanged

如果你的类实现了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时,将会有编译时错误,并且当它实现时将没有警告。

我不认为在接口中不继承INotifyPropertyChanged是不好的代码。相反,大多数时候我有一个接口为我的数据,像你的IPerson,然后两到三个实现,其中至少有一个显式实现INotifyPropertyChanged,因为它是一个控制台或服务器实现。