0

リフレクション、コンポーネントモデルタイプ記述子、式ツリー、アスペクトなど、これを行うさまざまな方法を見てきましたが、以下のコードが.Net4.0以降を使用して次のすべての目的を達成するかどうかはまだわかりません。

  1. タイプセーフで、リファクタリングに対応し(マジックストリングなし)、読みやすい
  2. 複数の呼び出しでパフォーマンスを最大化
  3. プロパティの名前を入力してください
  4. プロパティの値を提供します

コードをどのように改善できますか?

protected void NotifyOfPropertyChanging<TProperty>(Expression<Func<TProperty>> property) {
    var memberExpression = (MemberExpression)property.Body;
    var prop = (PropertyInfo) memberExpression.Member;

    var propertyName = prop.Name;
    var value = prop.GetValue(this, null);

    // fire INPC using propertyName
    // use value and name to do IsDirty checking
}
4

2 に答える 2

1

毎回呼び出すのではなく、式ツリーをコンパイルして将来使用するためにキャッシュすることで、パフォーマンスを向上させることができる場合があります。GetValueただし、このような最適化は、現在の実装がボトルネックを引き起こしている場合にのみ行う必要があります。

void NotifyOfPropertyChanging<TProperty>(Expression<Func<TProperty>> property)
{
    var memberExpression = (MemberExpression) property.Body;
    var prop = (PropertyInfo) memberExpression.Member;

    Func<TProperty> accessor;
    if (!TypedAccessorCache<TProperty>.Cache.TryGetValue(prop, out accessor))
    {
        accessor = property.Compile();
        TypedAccessorCache<TProperty>.Cache[prop] = accessor;
    }
    var value = accessor();

    // ...
}

static class TypedAccessorCache<TProperty>
{
    public static readonly IDictionary<PropertyInfo, Func<TProperty>> Cache =
        new Dictionary<PropertyInfo, Func<TProperty>>();
}

キャッシュディクショナリインスタンスを保持するためにジェネリック静的型を使用したことに注意してください。これは、個別のプロパティタイプごとに個別の型付きキャッシュを効果的に作成するための便利な方法です。

于 2012-05-05T17:25:30.733 に答える
0

それは長い話であり、他のアプローチよりも優れた単一のアプローチはまだないと思います。式は、ほとんどの通常のビジネスシナリオでパフォーマンスのボトルネックになることはないと思います(そして、必要に応じて後でより高速な通知が必要な小さなコードを最適化できます)。したがって、このアプローチは問題ありません。

式ツリーの作成は、解析よりもはるかに時間がかかることに注意してください。そのため、これは1回だけ行うようにしてください(つまり、静的なクラスレベルの式変数を使用します)。ただし、その場合、モデルコードは少し肥大化します。

私は個人的に文字列ベースのINPC処理を使用することを好みます。ReSharperは、リファクタリングに関しては文字列で正常に機能するため、比較的安全と言えます。私の知る限り、これが最速のアプローチです。また、VSまたはReSharperスニペットを使用すると、いくつかのキーストロークでプロパティを簡単に記述できます。

プロパティ値に関しては、INotifyPropertyChangingでもINotifyPropertyChangedインターフェイスでも使用されません。なぜあなたはそれが必要なのですか?

于 2012-05-05T12:54:29.530 に答える