任意のクラスへの拡張
Form1Proxy は Form1 クラス専用ではあるが、これを任意のクラスに対して拡張することは一見、難しくない。
呼び出しを記録するインスタンスを受け取り、そのインスタンスに対応した proxy を生成するだけである。
public class MethodLogger : RealProxy { private MarshalByRefObject target; public MethodLogger(MarshalByRefObject obj) : base( obj.GetType() ) { this.target = obj; } public static MarshalByRefObject Attach(MarshalByRefObject obj) { return new MethodLogger(obj).GetTransparentProxy() as MarshalByRefObject; } public override Invoke(IMessage msg) { if (msg is IMethodCallMessage) { IMethodCallMessage req = msg as IMethodCallMessage; // お好みのログを吐き出す Debug.WriteLine(req.MethodMame); // 実際の実装は、対象のインスタンスに委譲する return RemotingServices.ExecuteMessage(this.target, req); } throw new NotImplementException(); } }
一見、このクラスは前述の問題を除くと満足に動いているようにみえる。
これで本日の目的は達成したかに思えるが、いくつものクラスをテストしていれば、すぐに問題点に気が付くだろう。