web-dev-qa-db-ja.com

呼び出しメソッドとクラス名を決定する方法は?

現在、組み込みの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!

親メソッドとクラス名を取得する方法は?

37
Neurodefekt

このようなことを試してください:

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にはよりエレガントなソリューションがありますが、古いフレームワークを使用している場合は、上記が役立ちます。

25
Jens Kloster

Environment.StackTraceを使用して呼び出しメソッドだけでなく、完全なスタックトレースを記録することもできます。これは、同じログ構造を使用して例外を記録する場合に役立ちます。

詳細については、 このmsdnページ を参照してください。

2
daryal