.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];
}
}
クラスヘルパー。他のクラスを読みやすくします。また、Reflectionを使用せずにプロパティのリストを用意しています。使用法は次のとおりです。
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プロパティシステムとの違いはありません。