Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 属性值的容器_C#_.net - Fatal编程技术网

C# 属性值的容器

C# 属性值的容器,c#,.net,C#,.net,当.NET4.5发布时,我开始使用诸如CallerMemberName这样的优秀属性。代码更容易理解,开发人员也可以更快地编写代码。它就像一个片段,而不仅仅是用于调试/测试目的的特性 所以我有一个问题。创建和使用这样的东西是正常的吗 公共类属性存储 { 字典数据=新字典(); 视图模型库模型库; 内部属性存储(ViewModelBase\u base) { modelBase=_base; } public void SetValue(T值=默认值(T),[CallerMemberName]字符

当.NET4.5发布时,我开始使用诸如
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属性系统没有区别。

好主意,没有反射的属性包,甚至可以进行模糊处理

我看不出有什么大问题,但你可以考虑如下:

  • prop参数是可选的,因此在调用中给定一个值可能会引入错误
  • 值类型将被装箱
  • 对字段的访问相对更昂贵,这可能是一个更昂贵的因素,因为在一个简单的get中有更多的代码(尤其是使用装箱)
  • 字典占用的空间大于保留的属性数(尤其是装箱)
  • 每个属性还存储一个添加到开销中的属性名称字符串

  • 它的唯一功能是通过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);