There is no such thing as C# method logger
そういや C# で AOP 的なことできるんじゃろうか、と思って調べてみた結果非常に残念な結果になったというハナシ。 AOP 的とかいってるけど身も蓋もない言い方をすると method への message を横取りして log をはくにはどうすれば的な。
とりあえず以下の page に書かれている方法でそれっぽいものはできる。
- http://www.ne.jp/asahi/nami/mei/cstips/methodlog.html
- http://architect360.apricot-jp.com/300/netaop.html
- http://d.hatena.ne.jp/ladybug/20041022
んだけどこれ logging したい class を System.ContextBoundObject から派生させないといけないという制限がつく。で、それだけなら type 数増えるのかめんどくせぇで済むんだけどこの ContextBoundObject てのがクセがありすぎて諸残念の根源。
現在のバージョンの共通言語ランタイムは、ジェネリック型 ContextBoundObject またはジェネリック メソッドを含む非ジェネリック型 ContextBoundObject をサポートしません。このような型のインスタンスを作成しようとすると、TypeLoadException が発生します。
ContextBoundObject Class (System) | Microsoft Docs
いやお前 Generics 使うなてさらっと書いてあるけどこれつまり System.IEquatable<> も System.IComparable<> も使うなってことだよな。つまり C# 2.0 以降の作法を無視しろと。
これはどうなの…、とか思いつつあーいやでもうーん、上記の文章は実体化したい class 自体が generics class でなければいいとも読めるので一応以下の code も試してみた。
class A<T> : ContextBoundObject { } class B : A<int> { } class Program { [STAThread] static void Main(string[] args) { B b = new B(); } }
TypeLoadException いただきました。はいはい C# 2.0 以降門前払い。というわけで C# には method logging なんてものはなかったという結論。