任意のクラスへの拡張

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();
    }
  }

一見、このクラスは前述の問題を除くと満足に動いているようにみえる。
これで本日の目的は達成したかに思えるが、いくつものクラスをテストしていれば、すぐに問題点に気が付くだろう。