3

ログメッセージを取得するログメソッドを持つ「ロガー」クラスがあり、メッセージと呼び出し元のメソッドをログに書き込みます。最初に、ログメソッドに新しいパラメーターを送信するために次のことも行いましたMethod.Base.GetCurrentMethod()。Relection.MethodBase を使用する別の方法を見つけました。

public void Log(string message)
{
   stackTrace = new StackTrace();
   string methodName = stackTrace.GetFrame(1).GetMethod().Name;
   ....
}

しかし、log メソッドを呼び出すたびに から新しいインスタンスをStackTrace作成する必要があり、コンストラクターでインスタンスを作成しようとすると、メソッド名がInvokeMethod.

プロジェクトでは MEF を使用しています。コードを改善する方法はありますか?

4

4 に答える 4

6

C# (5) の最新かつ最高のバージョンを使用している場合、これは call-site 属性を介して言語に組み込まれています。次のように使用します。

public void Log(string message, [CallerMemberName] string methodName = null)
{
}

2 番目のパラメーターを指定せずにメソッドを呼び出すと、C# コンパイラによって自動的に入力されます。次の Call-Site 属性を自由に使用できます: CallerMemberNameCallerLineNumber、およびCallerFilePath

于 2012-12-16T09:51:13.323 に答える
3

「情報ログ」(例外の詳細がないログ)には、完全なスタックトレースを使用することをお勧めします。

StackTrace stackTrace = new StackTrace(true); 
string stackTraceString = stackTrace.ToString();

ソース情報を含む完全なスタックトレースを提供します。

ただし、catchステートメントのログなど、例外インスタンスを持つログがある場合は、メソッドの呼び出しだけでなく、スタックトレースと例外自体の内部例外情報を使用できます。

StackTrace stackTrace = new StackTrace(ex, true); 
string stackTraceString = stackTrace.ToString();

(ex)は例外ですが、スタックトレースが必要です。

* 編集 *

または、次を使用できます。

Environment.StackTrace、これは文字列プロパティです!get_StackTraceの呼び出しが含まれているので、この部分を削除する簡単なコードを書くことができますが、スタックトレースオブジェクトを必要に応じて作成することは問題ないと思います。大したことではありません。

于 2012-12-16T08:46:19.840 に答える
1

ソリューションを実装する前に、メソッドのインライン化に注意する必要があります。

Scott Hanselman によるこの記事を見てください。彼はほぼ同じ機能を実装しようとしています。ここにいくつかの詳細情報

于 2012-12-16T08:50:15.530 に答える
0

そのために PostSharp を使用できます。コードを改善する方法の例については、このページをご覧ください。

于 2012-12-16T09:51:48.863 に答える