C# 改变get的功能;设置关键词

C# 改变get的功能;设置关键词,c#,.net,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" };

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

 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));
        }
    }

}

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

今天,在AOP(面向方面编程)的帮助下,这是可能的

例如,对于,代码如下所示:

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

今天,在AOP(面向方面编程)的帮助下,这是可能的

例如,对于,代码如下所示:

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

已经为您提供了大量减少样板代码的选项。但是,如果你坚持通过改变自动getter和setter的工作方式来解决这个问题,那么你就无法做到这一点

如果我能很好地理解默认得到;设置在某处存储一个值,那么为什么我不能自己管理它呢


因此,编写您自己的自定义getter和setter,并使用您自己的自定义backing字段。这正是他们在那里的目的。同样,提供给您的其他选项也是为了减少样板代码,但最终,您仍然必须使用自定义访问器和支持字段实现
INotifyPropertyChanged
,因为这是超出自动实现属性范围的附加逻辑。

为您提供了大量减少样板代码的选项。但是,如果你坚持通过改变自动getter和setter的工作方式来解决这个问题,那么你就无法做到这一点

如果我能很好地理解默认得到;设置在某处存储一个值,那么为什么我不能自己管理它呢


因此,编写您自己的自定义getter和setter,并使用您自己的自定义backing字段。这正是他们在那里的目的。同样,提供给您的其他选项是为了减少样板代码,但最终,您仍然必须使用自定义访问器和支持字段实现
INotifyPropertyChanged
,因为这是超出自动实现属性范围的附加逻辑。

是的,这将非常好。现在,您真正的问题是什么?如果您的目标只是减少编写代码的数量,那么您实际上要求生成代码。首先,我震惊了一些人。第二,我会尽力核实你的要求。基于最后一个堆栈帧在基类中封装get set逻辑是一种好的做法吗?可能更适合于此类问题。
{get;set;}
已经是更详细的属性结构的快捷方式。您无法更改它的行为方式。与实际的支持字段相比,将属性存储在字典中是个坏主意。是的,那将非常好。现在,您真正的问题是什么?如果您的目标只是减少编写代码的数量,那么您实际上要求生成代码。首先,我震惊了一些人。第二,我会尽力核实你的要求。基于最后一个堆栈帧在基类中封装get set逻辑是一种好的做法吗?可能更适合于此类问题。
{get;set;}
已经是更详细的属性结构的快捷方式。您无法更改它的行为方式。与实际的支持字段相比,将属性存储在字典中是个坏主意。是的,但这不是重点,我可以自己创建一个应用程序来更改get;和布景;编译之前,但这不是我要问的。@JuanPabloGarciaCoello这确实是你唯一的选择。是的,但这不是重点,我可以自己创建一个应用程序来改变get;和布景;在编译之前,但这不是我要问的。@JuanPabloGarciaCoello这确实是你唯一的选择。我的问题是反思性的,C#必须改进这一切,因为应用程序每天都在编码,而不是抱怨如何解决它。可能要求uservoice添加另一个keword,如defineget:。。。。Thanks@JuanPablo Garcia Coello:这与PostSharp已经做的没有什么不同。我的问题的想法是反思性的,C#必须改进所有这一切,因为应用程序每天都在编码,而不是抱怨如何解决它。可能要求uservoice添加另一个keword,如defineget:。。。。Thanks@Juan帕布罗·加西亚·科埃罗:这和波斯夏普已经做的没有什么不同。