現在、組み込みのTraceListenerを使用してアプリケーションロギングライブラリを開発しています。このライブラリは多くのプロジェクトで使用され、ログファイルに書き込まれるのはHOWではなくWHATだけを気にする必要があるシンプルなインターフェイスを提供する必要があります。
リフレクション名前空間を使用することで、現在どのアプリケーションがログ関数を呼び出しているか(実行アセンブリ名を取得)を特定できますが、ロギング関数を呼び出した関数とクラスの名前も必要です。
私が持っているとしましょう:
public static void LogInfo(string vLogText) {
Trace.WriteLine(
MethodInfo.GetCurrentMethod().Name
+ this.GetType().ToString() + vLogText);
}
別のプロジェクトから呼び出す場合(クラス:TestClass、メソッド:TestMethod)
Tracer.LogInfo("log this!")
ログに表示されることを期待しています:
TestClass, TestMethod, log this!
しかし、代わりに私は得た
TracerClass, LogInfo, log this!
親メソッドとクラス名を取得する方法は?
このようなことを試してください:
var mth = new StackTrace().GetFrame(1).GetMethod();
var cls = mth.ReflectedType.Name;
// where 1 illustrates how deep into the stack to reflect.
C#5.0にはよりエレガントなソリューションがありますが、古いフレームワークを使用している場合は、上記が役立ちます。
Environment.StackTrace
を使用して呼び出しメソッドだけでなく、完全なスタックトレースを記録することもできます。これは、同じログ構造を使用して例外を記録する場合に役立ちます。
詳細については、 このmsdnページ を参照してください。