当 .NET 4.5 发布时,我开始使用 .NET 等出色的属性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
接口。
据我了解,这种方法类似于 Microsoft Dependency Properties,但我不需要DependencyObject
类的所有功能,也不想继承它。有了这样的东西我可以使用Binding,因为它足以实现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); }
}
}
与 Microsoft 的 WPF 属性系统没有区别。