Method logger is just a dream now
http://d.hatena.ne.jp/janus_wel/20101212/1292157491 の comment で method を横取りするなら System.Dynamic.DynamicObject をいじるといいかもね ! という情報を頂いたのでこうですかわかりません><状態。ありがとうございます > id:ladybug さん。
- http://msdn.microsoft.com/ja-jp/library/system.dynamic.dynamicobject.aspx
- http://msdn.microsoft.com/ja-jp/library/system.dynamic.dynamicobject_members.aspx
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 修飾子のせいか汎用性がない
だめだこりゃ。