2013-01-15 30 views
1

当.NET 4.5发布时,我开始使用如CallerMemberName这样的很好的属性。理解代码更容易,开发人员也可以更快地编写代码。这就像一个片段,不仅是调试/测试目的的一个功能。属性值容器

所以我有一个问题。创建和使用这样的东西是否正常?

public class PropertyStore 
{ 
    Dictionary<string, object> data = new Dictionary<string,object>(); 
    ViewModelBase modelBase; 

    internal PropertyStore(ViewModelBase _base) 
    { 
     modelBase = _base; 
    } 

    public void SetValue<T>(T value = default(T), [CallerMemberName] string prop = "") 
    { 
     T prev = GetValue<T>(prop); 
     if ((prev == null && value == null) || (prev != null && prev.Equals(value))) return; 
     data[prop] = value; 
     modelBase.OnPropertyChanged(prop); 
    } 

    public T GetValue<T>([CallerMemberName] string prop = "") 
    { 
     if (!data.ContainsKey(prop)) 
      data[prop] = default(T); 
     return (T)data[prop]; 
    } 
} 

类助手,使其他类更具可读性,也有我们的属性列表,而无需使用反射。 用法是:

public class SampleClass : ViewModelBase 
{ 
    PropertyStore PropertyStore; 

    public SampleClass() 
    { 
     PropertyStore = new PropertyStore(this); 
    } 

    public string Key 
    { 
     get { return PropertyStore.GetValue<string>(); } 
     set { PropertyStore.SetValue(value); } 
    } 
    public DateTime Date 
    { 
     get { return PropertyStore.GetValue<DateTime>(); } 
     set { PropertyStore.SetValue(value); } 
    } 
    public bool IsSelected 
    { 
     get { return PropertyStore.GetValue<bool>(); } 
     set { PropertyStore.SetValue(value); } 
    } 
} 

ViewModelBase这里简单实现INotifyPropertyChanged接口。

据我所知,这种方法就像微软依赖属性,但我不需要DependencyObject类的所有权力,我不想继承它。 有了这样的东西,我可以使用绑定,因为它足以实现INotifyPropertyChanged,我们也没有字段(至于我,我尝试使用更聪明的属性,比直接使用字段(但是,没有问题直接使用Dictionary^_ ^))

对不起,我的英语不好......不是主要语言,也没有太多练习。

另一个样品(移动的方法对基类)之后

public class SampleClass : ViewModelBase 
{ 
    public string Key 
    { 
     get { return GetValue<string>(); } 
     set { SetValue(value); } 
    } 
    public DateTime Date 
    { 
     get { return GetValue<DateTime>(); } 
     set { SetValue(value); } 
    } 
    public bool IsSelected 
    { 
     get { return GetValue<bool>(); } 
     set { SetValue(value); } 
    } 
} 

与微软的WPF产权制度不存在。

回答

1

好主意,没有反射的财产袋,它甚至会混淆工作。

我看不出它的主要问题,但你可以考虑以下几点:

  1. prop参数是可选的,所以潜在的错误可以通过调用给定的值来介绍。
  2. 值类型将被装箱。
  3. 对字段的访问相对比较昂贵,可能是一个更贵的因素,因为你在一个简单的get(特别是装箱)中有更多的代码。
  4. 词典需要比您保留的属性数量更多的空间(尤其是拳击)。
  5. 每个属性还存储一个字符串的属性名称添加到开销。
+0

thx为答案。没有任何事情可以做到可选...所以我的团队必须小心。是的,但即使是微软使用特殊类来拳击布尔:) 3和4大减这种方法,是的。从角度来看,它不仅可以是姓名,也可以是另一个“元数据”。至于我,这非常有用,因为如你所说,它是“没有反思的包”。动态地需要做大量的工作... – Spawn

1

只有你将会得到的功能是通过Dictionary.Get | Set方法访问属性值的功能。

您可以通过INotifyPropertyChanged的基于字段的实现获得此能力。您可以使用字典通过名称访问属性值,使用属性名称来预编译委托映射,就像在Yappi项目中完成的一样。

var dateValue= Property<SampleClass>.Get<DateTime>(this,"Date"); 
Property<SampleClass>.Set<DateTime>(this,"Date",DateTime.Now); 

两者都可以改写为扩展方法。

+0

嗯,它是运行时的实现......没有竞争力^ _ ^我会考虑的。 Thx为链接。 – Spawn

+0

这样做的好处是,您可以在任何现有课程中使用此功能,只需进行很少的更改。鉴于原创想法要求您更改所有get和set访问器到相同的重复代码。 –