2017-11-20 4 views
0

私は、一連のプロパティを持つクラスを持っています。私がやろうとしているのは、実行時にプロパティセッターが呼び出されたときに実行されるカスタムコード行を動的に追加することです。クラスに振る舞いを動的に追加する

これを達成する方法はありますか? Entity Frameworkとmockingフレームワークのように元のクラスをラップするプロキシクラスを作成するにはどうすればいいですか?

+0

クラスを変更できますか? – dasblinkenlight

+0

いいえ、私はクラスを所有していません。 – Sisyphus

+0

このクラスからも継承できませんか? –

答えて

1

あなたが書いていないクラスに振る舞いを動的に追加するのはお勧めしません。これは述べてOpen-Closed Principle、違反:

ソフトウェアエンティティ(クラス、モジュール、関数など)は拡張のため 開いている必要がありますが、変更のため閉鎖。

この場合、実行時までクラス構造がどのように見えるのかわからない場合は、メソッド/プロパティにアクセスする唯一のオプションは、元のクラスをラップし、Reflectionをアクセスクラスに使用するメンバー。 Type.GetProperties方法のドキュメントを見て、さらに読書のために

using System; 
using System.Reflection; 

public class ProxyClass 
{ 
    public Type WrappedType { get; private set; } 
    public Object WrappedObject { get; private set; } 


    public ProxyClass(Object wrappedObject) 
    { 
     WrappedObject = wrappedObject; 
     WrappedType = wrappedObject.GetType(); 

    } // end constructor 

    public object GetPropVal(String propName) 
    { 
     return WrappedType.GetProperty(propName).GetValue(WrappedObject, null); 
    } // end GetPropVal 

    public void SetPropVal(String propName, Object val) 
    { 
     WrappedType.GetProperty(propName).SetValue(WrappedObject, val, null); 
    } // end SetPropVal 

} // end class ProxyClass 

を - これは:ここ

は、ラッパークラスは、オブジェクトのプロパティにアクセスするためにリフレクションを使用してどのように見えるかの(未テスト)の例でありますラップしようとしているオブジェクトに特定のプロパティが存在するかどうかを判断するのに役立ちます。

関連する問題