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帕布罗·加西亚·科埃罗:这和波斯夏普已经做的没有什么不同。