メソッド呼び出しを記録する

とりあえず、実装に入るためには、 Form1 クラスが先に必要なので、

public Form1
{
  private int current = 0;

  public int Add(int value)
  {
    checked
    {
      int oldValue = current;

      this.current += value;

      return oldValue;
    }
  }
}

このような単純なクラスであることにしよう。
ここで次のようなコードを実行すると、TransparentProxy の Add() メソッドが呼び出される。

  private static void Test()
  {
    Form1Proxy proxy = new Form1Proxy();
    Form1 form1 = proxy.GetTransparentProxy() as Form1;

    form1.Add( 10 );
  }

TransparentProxy の Add メソッドは IMessage の形で stub へメソッドを転送する、と書いた。
クラス名は Form1Proxy と Proxy なんて名乗っているし、変数名も proxy にしてしまったが、実はこいつがスタブである。*1
つまり、転送された IMessage は、Form1Proxy.Invoke() に転送されるのだ。

ついに、メソッドの呼び出しを記録することに成功する。

  public override IMessage Invoke(IMessage msg)
  {
    // メソッド呼び出しは IMethodCallMessage である
    IMethodCallMessage request = msg as IMethodCallMessage;

    // メソッドの呼び出しを記録する
    Debug.WriteLine(request.MethodName + "が呼び出されました!");

    // TODO: 何を IMessage にして return すればよいのか?

    // NG
    return msg; 
  }

*1:本来の姿としては、受け取ったメッセージを stub へ転送するという実装を行う。よって、まさに Proxy なのだが…