Method logger is just a dream now

http://d.hatena.ne.jp/janus_wel/20101212/1292157491 の comment で method を横取りするなら System.Dynamic.DynamicObject をいじるといいかもね ! という情報を頂いたのでこうですかわかりません><状態。ありがとうございます > id:ladybug さん。

DynamicObject.TryInvokeMember() あたりを override すりゃいいのかなと思ったんだけどこの method は動的に binding されるときにしか呼ばれない、つまり class 内に定義してある method を呼んだ場合は呼ばれないらしい。この時点でなんか違うようなと思いつつ「なら名前が違えばいいんでしょー」という方向で GO☆RI☆O☆SHI code を書いてみた。

using System;
using System.Dynamic;
using System.Reflection;

namespace MethodLoggerTest
{
    public class MethodLogger : DynamicObject
    {
        public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
        {
            string methodName = binder.Name + "_";
            MethodInfo method = this.GetType().GetMethod(methodName);

            if (method == null)
            {
                throw new Exception("not found: " + methodName);
            }

            result = method.Invoke(this, args);

            Console.WriteLine("invoked: " + methodName);
            Console.WriteLine("with:");
            foreach (object arg in args)
            {
                Console.WriteLine("\t" + arg.ToString());
            }
            Console.WriteLine("result: " + result.ToString());

            return true;
        }
    }

    public class A : MethodLogger
    {
        public int Zero_()
        {
            return 0;
        }
        public string DoubleString_(int n)
        {
            return (2 * n).ToString();
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            dynamic a = new A();
            a.Zero();
            a.DoubleString(3);
        }
    }
}

とりあえず可視性とか命名規則ぶっちとかはおいといて

  • dynamic 修飾子を使って object をいれる変数を宣言しないといけない
  • dynamic 修飾子のせいか Intellisense が働かない
  • dynamic 修飾子のせいか汎用性がない

だめだこりゃ。