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を使ってごにょごにょしたほうがカッコイイし。(^^;