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