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];
    }
}

クラスヘルパー。他のクラスを読みやすくします。また、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プロパティシステムとの違いはありません。

4

2 に答える 2

2

これで得られる唯一の機能は、Dictionary.Get|Setメソッドを介してプロパティ値にアクセスする機能です。

この機能は、INotifyPropertyChangedのフィールドベースの実装で取得できます。辞書を使用して名前でプロパティ値にアクセスできます。プロパティ名は、Yappiプロジェクトで行われるようにプリコンパイルされたデリゲートマッピングになります。

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

どちらも拡張メソッドとして書き直すことができます。

于 2013-01-15T09:51:05.337 に答える
1

いいアイデア、反射のないプロパティバッグ、そしてそれは難読化でも機能します。

大きな問題は見られませんが、次のことを検討してください。

  1. propパラメータはオプションであるため、呼び出しで値を指定することでバグが発生する可能性があります。
  2. 値の型はボックスで囲まれます。
  3. フィールドへのアクセスは比較的高価ですが、単純な取得ではるかに多くのコードがあるため(特にボクシングの場合)、より高価になる可能性があります。
  4. 辞書は、保持するプロパティの数よりも多くのスペースを必要とします(特にボクシングの場合)。
  5. 各プロパティには、オーバーヘッドに追加されるプロパティ名の文字列も格納されます。
于 2013-01-15T08:51:19.900 に答える