There is no such thing as C# method logger

そういや C#AOP 的なことできるんじゃろうか、と思って調べてみた結果非常に残念な結果になったというハナシ。 AOP 的とかいってるけど身も蓋もない言い方をすると method への message を横取りして log をはくにはどうすれば的な。

とりあえず以下の page に書かれている方法でそれっぽいものはできる。

んだけどこれ 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 なんてものはなかったという結論。