2011-10-30 3 views
2

私は多くのINotifyPropertyChangedとIDataErrorInfoを自動化するために使用している抽象クラスを作成しました。しかし、これはすべてのプロパティに対してカスタムメソッドを呼び出すカスタムgetter/setterを指定する必要があります。プロパティgetters/settersを注入/処理しますか?

私は余分な型を避けるために、オブジェクトのプロパティgetters/setterをオーバーライド/処理し、生成されたgetter/setterの代わりにカスタムメソッドを呼び出す方法を見つけようとしています。

DynamicObjectから継承し、TryGetMemberとTrySetMemberを上書きしようとしましたが、これらのメソッドは、オブジェクトが動的として宣言されている場合にのみ動作するように見えます。

私が達成しようとしていることが.NETリフレクションやその他のメカニズムを介して可能であるかどうかを知りたいのですが、プロパティーセッター/ゲッターがコードで定義されているかどうかを検出する方法もありますか?

ありがとう、 アレックス。

+1

これを試してください。 http://code.google.com/p/notifypropertyweaver/ – Simon

答えて

3

タイプのプロパティに関する情報は、Type.GetPropertiesメソッドを使用して取得できます。 PropertyInfoオブジェクトのコレクションが届きます。それらのオブジェクトは、プロパティが読み書き可能であるかどうかを示すCanReadCanWriteというプロパティを持っています。どこのことができます

  • ダイナミックプロキシは、効果的にゲッターとセッターありget_PropAとset_PropAの形でメソッドへの呼び出しをインターセプトする必要があり、ダイナミックプロキシジェネレータを作成

    1. :にあなたが持っているでしょう、この動作を無効にするには

      追加ロジックを追加してください

    2. これらのオブジェクトを作成するコードでコンストラクタを使用する代わりに、オブジェクトを作成してプロキシ内部にラップするプロキシジェネレータを使用してください。
    3. 当然のことながら、あなたのクラスは密閉されてはいけない、とプロパティは、あなたがCastle DynamicProxyを使用するのが最善です自由ソリューションのためのプロキシ

    を作成するために、仮想なければなりません。お金を使う準備ができている場合は、すでに同じような性質の多くのものを実装しているPostSharpをご覧ください。 INotifyPropertyのchageのように、元に戻す/やり直すなど。アスペクト・ウィービングをサポートするAOPフレームワークも見てみることができますが、DynamicProxyはあなたが記述した状況のために選ぶことができます。

  • 関連する問題