包装属性设置器

Ing*_*als 6 c# properties wrapper

我发现自己很重复,这当然不好.所以我想知道我是否可以为此做些什么.这是我的WPF应用程序中的常见代码:

private string _name;
public string Name
{
    get { return _name; }
    set
    {
        if (_name != value)
        {
            _name = value;
            OnPropertyChanged("Name");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

所以我想知道我是否可以以某种方式包装setter以使其更好,更具可读性.一个想法是这样的:

protected void PropertySetter<T>(T property, T value, string name)
{
    if (EqualityComparer<T>.Default.Equals(property, value))
    {
        property = value;
        OnPropertyChanged(name);
    }
}
Run Code Online (Sandbox Code Playgroud)

用法如下:

private string _name2;
public string Name2
{
    get { return _name2; }
    set
    {
        PropertySetter<string>(Name2, value, "Name2");
    }
}
Run Code Online (Sandbox Code Playgroud)

但我不确定这是非常聪明还是与Value类型一样好用?

我想我不是第一个尝试这样的事情的人,所以如果有人知道这样的事情是一个很好的万无一失的方式,请加入.我想我不能让财产改变类型安全没有反思,但任何想法也会有所帮助.

qJa*_*ake 2

是的 - 这是完全可以接受的正常代码。

这是我发现的一个非常标准化的示例(我在代码示例中看到了很多这种类型的用法)。

public event PropertyChangedEventHandler PropertyChanged;

private void SetProperty<T>(ref T field, T value, string name)
{
    if (!EqualityComparer<T>.Default.Equals(field, value))
    {
        field = value;
        var handler = PropertyChanged;
        if (handler != null)
        {
          handler(this, new PropertyChangedEventArgs(name));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

将此代码包装在实现 的类中INotifyPropertyChanged,并从该类继承您的数据对象。

在您的示例中,您直接调用事件 -切勿这样做。从方法启动到调用事件期间,您可能会丢失事件引用。在调用事件之前始终创建事件的本地缓存。