改变get; set的功能;关键字

时间:2016-05-25 06:23:39

标签: c# .net

为了避免编码,我实现了一个字典来存储属性值:

 public class MainViewModel
{
    public List<Person> People { get; set; }
    public Person Boss { get; set; }
    int i = -1;

    public MainViewModel()
    {
        Boss = new Person() { Name = "The Boss" };
        People = new List<Person>();

        while (++i < 10)
        {
            People.Add(new Person() { Name = $"Person {i}" });
        }

        Update();
    }

    private async void Update()
    {
        await Task.Delay(1000);

        Boss.Name = $"The Boss {++i}";

        Update();
    }
}

public class Person : Model
{
    public string Name
    {
        get { return GetProperty<string>(); }
        set { SetProperty(value); }
    }
}


public class Model : INotifyPropertyChanged
{
    private Dictionary<string, object> properties;
    public event PropertyChangedEventHandler PropertyChanged;

    public Model()
    {
        properties = new Dictionary<string, object>();
    }

    protected T GetProperty<T>([CallerMemberName] string key = null)
    {
        if(properties.ContainsKey(key))
        {
            return (T)properties[key];
        }
        return default(T);
    }

    protected void SetProperty<T>(T newvalue, [CallerMemberName] string key = null)
    {
        properties[key] = newvalue;
        NotifyPropertyChanged(key);
    }

    public void NotifyPropertyChanged([CallerMemberName] string caller = "")
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(caller));
        }
    }

}

正如您所看到的那样,get模型中的get和set的功能是否只使用:

public string Name { get;set;}

简化代码真的很棒。这有可能吗?可能在C#7?

2 个答案:

答案 0 :(得分:4)

今天可以在AOP(面向方面​​编程)的帮助下实现。

E.g。使用PostSharp,代码如下所示:

[NotifyPropertyChanged]
public class Person
{
     public string Name { get; set; }
}

答案 1 :(得分:3)

已经为您提供了许多减少样板代码的选项。但如果你坚持通过改变自动吸气剂和定位器的工作方式来解决这个问题,那么你根本就无法做到这一点。

  

如果我理解的是默认的get; set;在某处存储价值,为什么我不能自己管理呢?

所以编写自己的自定义getter和setter并使用自己的自定义支持字段。这正是他们的目的所在。同样,给你的其他选项是减少样板代码,但是在一天结束时,仍然必须使用自定义访问器和支持字段来实现INotifyPropertyChanged,因为这是一个超出自动实现属性范围的额外逻辑。