TypeDelegatorって?

VS.NETでF5やCTRL-F5を押すと突然終了してしまう現象に悩まされました。最初、VS2005を入れた所為だと思い、アンインストールをしてもちっとも直らず、あれこれ消していたらやっと直った。どうやら、DevPartnerの体験版が壊れていたみたいでした。おかげでVS2005とか入れ直さないと・・・

そんなこんなやっているウチに時間もなくなってきたので、クラスライブラリをざっと眺めながらめぼしいクラスをチェック。TypeDelegatorが目にとまりヘルプを読んでみる。

Type オブジェクトをラップし、すべてのメソッドをこの型にデリゲートします。

・・・意味がよく分からないのですが。(^^;
色々弄くってみると、どうやらヘルプに書いてあるデリゲートはdelegateじゃなくて、委譲という意味だと思われ。Typeから直接継承すると山のように抽象メソッドをオーバーライドしないといけないので、デフォルト実装を用意した便利クラスみたいです。でも、結局、TypeDelegatorって何に使うのか分からないので、無理矢理サンプルを作ってみました。

using System;
using System.Reflection;

class MyClass {
  public void SayHello() {
    Console.WriteLine("Hello!");
  }
}

class LoggedType : TypeDelegator {
  public LoggedType(Type t) : base(t) {} 
  public override object InvokeMember(string name, BindingFlags invokeAttr, 
    Binder binder, object target, object args, ParameterModifier modifiers, 
    System.Globalization.CultureInfo culture, string[] namedParameters) 
  {
    // メソッドの呼び出しと戻りの時刻を記録する
    Console.WriteLine(">>" + name + ":" + DateTime.Now);
    object ret =  base.InvokeMember(name, invokeAttr, binder, 
      target, args, modifiers, culture, namedParameters);
    Console.WriteLine("<<" + name + ":" + DateTime.Now);
    return ret;
  }
}

class Program {
  public static void Invoke(Type t, string method) {
    // 指定したメソッドを実行
    object o = Activator.CreateInstance(t);
    t.InvokeMember(method, BindingFlags.InvokeMethod, null, o, null);
  }

  public static void Main() {
    Invoke(typeof(MyClass), "SayHello");
    Invoke(new LoggedType(typeof(MyClass)), "SayHello");
  }
}

/* 結果
Hello!
>>SayHello:2004/08/06 0:51:16
Hello!
<<SayHello:2004/08/06 0:51:16
 */

あんま、InvokeMethodなんか使うこと無いので、出番はなさそう。これなら、http://d.hatena.ne.jp/akiramei/20040328#p1でやったみたいにRealProxyを使ってごにょごにょしたほうがカッコイイし。(^^;