私は、一連のプロパティを持つクラスを持っています。私がやろうとしているのは、実行時にプロパティセッターが呼び出されたときに実行されるカスタムコード行を動的に追加することです。クラスに振る舞いを動的に追加する
これを達成する方法はありますか? Entity Frameworkとmockingフレームワークのように元のクラスをラップするプロキシクラスを作成するにはどうすればいいですか?
私は、一連のプロパティを持つクラスを持っています。私がやろうとしているのは、実行時にプロパティセッターが呼び出されたときに実行されるカスタムコード行を動的に追加することです。クラスに振る舞いを動的に追加する
これを達成する方法はありますか? Entity Frameworkとmockingフレームワークのように元のクラスをラップするプロキシクラスを作成するにはどうすればいいですか?
あなたが書いていないクラスに振る舞いを動的に追加するのはお勧めしません。これは述べて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
を - これは:ここ
は、ラッパークラスは、オブジェクトのプロパティにアクセスするためにリフレクションを使用してどのように見えるかの(未テスト)の例でありますラップしようとしているオブジェクトに特定のプロパティが存在するかどうかを判断するのに役立ちます。
クラスを変更できますか? – dasblinkenlight
いいえ、私はクラスを所有していません。 – Sisyphus
このクラスからも継承できませんか? –