C# 属性值的容器
当.NET4.5发布时,我开始使用诸如C# 属性值的容器,c#,.net,C#,.net,当.NET4.5发布时,我开始使用诸如CallerMemberName这样的优秀属性。代码更容易理解,开发人员也可以更快地编写代码。它就像一个片段,而不仅仅是用于调试/测试目的的特性 所以我有一个问题。创建和使用这样的东西是正常的吗 公共类属性存储 { 字典数据=新字典(); 视图模型库模型库; 内部属性存储(ViewModelBase\u base) { modelBase=_base; } public void SetValue(T值=默认值(T),[CallerMemberName]字符
CallerMemberName
这样的优秀属性。代码更容易理解,开发人员也可以更快地编写代码。它就像一个片段,而不仅仅是用于调试/测试目的的特性
所以我有一个问题。创建和使用这样的东西是正常的吗
公共类属性存储
{
字典数据=新字典();
视图模型库模型库;
内部属性存储(ViewModelBase\u base)
{
modelBase=_base;
}
public void SetValue(T值=默认值(T),[CallerMemberName]字符串prop=”“)
{
T prev=GetValue(prop);
if((prev==null&&value==null)| |(prev!=null&&prev.Equals(value)))返回;
数据[prop]=值;
modelBase.OnPropertyChanged(道具);
}
public T GetValue([CallerMemberName]字符串prop=”“)
{
如果(!data.ContainsKey(prop))
数据[prop]=默认值(T);
返回(T)数据[prop];
}
}
类帮助器,这使其他类更具可读性,而且我们有属性列表,而不需要使用反射。
用法是:
public类SampleClass:ViewModelBase
{
房地产商店房地产商店;
公共样本类()
{
PropertyStore=新的PropertyStore(此);
}
公共字符串密钥
{
获取{return PropertyStore.GetValue();}
set{PropertyStore.SetValue(value);}
}
公共日期时间日期
{
获取{return PropertyStore.GetValue();}
set{PropertyStore.SetValue(value);}
}
公选学校
{
获取{return PropertyStore.GetValue();}
set{PropertyStore.SetValue(value);}
}
}
这里的类ViewModelBase
只是实现了INotifyPropertyChanged
接口
据我所知,这种方法类似于Microsoft Dependency Properties,但我不需要DependencyObject
类的所有功能,也不想继承它。
有了这样的东西,我可以使用绑定,因为它足以实现INotifyPropertyChanged
,而且我们没有字段(对我来说,我尝试比直接使用字段更智能地使用属性(但是,直接使用字典
没有问题)
对不起,我的英语不好。。。不是主要的语言,也没有太多的练习
另一个示例(将方法移动到基类后)
public类SampleClass:ViewModelBase
{
公共字符串密钥
{
获取{return GetValue();}
set{SetValue(value);}
}
公共日期时间日期
{
获取{return GetValue();}
set{SetValue(value);}
}
公选学校
{
获取{return GetValue();}
set{SetValue(value);}
}
}
与微软的WPF属性系统没有区别。好主意,没有反射的属性包,甚至可以进行模糊处理 我看不出有什么大问题,但你可以考虑如下:
它的唯一功能是通过Dictionary.get | Set方法访问属性值 您可以通过基于字段的INotifyPropertyChanged实现来获得此功能。您可以使用字典按名称访问属性值,属性名称与项目中的预编译委托映射相同
var dateValue=Property.Get(这是“日期”);
设置(这个“日期”,DateTime.Now);
这两种方法都可以重写为扩展方法。thx获取答案。这跟可选的没什么关系。。。所以我的团队必须小心。是的,但即使是微软也使用了特殊的类来装箱布尔:)3和4是这种方法的一大缺点,是的。在透视图中,它不仅可以是名称,还可以是另一个“元数据”。对我来说,这是非常有用的,因为正如你所说的,这是“没有反射的袋子”。需要动态地做很多工作……嗯,这是运行时实现……我会考虑的。链接的Thx。这样做的好处是,您可以在对任何现有类进行最小更改的情况下使用它。而最初的想法要求您将所有get和set访问器更改为相同的重复代码。
var dateValue= Property<SampleClass>.Get<DateTime>(this,"Date");
Property<SampleClass>.Set<DateTime>(this,"Date",DateTime.Now);