1

重複の可能性:
C#で呼び出し元のメソッドを取得する方法

Log次のように、ログに記録されたメッセージの前にクライアントのクラスとメソッドを追加することになっているクラスがあります。

[ClientClass.ClientMethod] This is the logged message.

そして、クライアントからパラメーターとして渡すことなく、クラスからLogこれらの値を取得するための安全な方法を探しています。私はこれまでこれを試しました:

var stackFrame = new StackFrame(StackFramesToSkip);
var method = stackFrame.GetMethod();
return string.Format("[{0}.{1}] {2}", method.DeclaringType.Name, method.Name, message);

ただし、このメソッドは常に呼び出し元のメソッドを生成するとは限りません。特に複数のスレッドで作業する場合。

これを行う安全な方法はありますか?私はアイデアがありません。

ありがとう!

4

1 に答える 1

2

現在のメソッドの名前を取得し、その名前をパラメーターに転送するために使用できますSystem.Reflection.MethodBase.GetCurrentMethod()が、それらは必要ないとおっしゃいました。まあ、私は他のいくつかの方法を知っています。

  1. .NET 4.5ベータ版では、この発信者情報を使用できます。
  2. 動的プロキシを使用できます。ロギングメソッドには引き続きパラメーターが必要ですが、動的プロキシを使用すると、呼び出しを1回だけ行い、それをメソッドに動的に追加できます。ContextBoundObjectまたはCastleDynamicProxyを使用できます
  3. AOPフレームワークを使用できます。これにより、(2)と同様のことができますが、より適切です。基本的に、フレームワークによっては、ビルド時に呼び出しを動的ではなく静的に追加できます。これが優れたAOPフレームワークです:PostSharp

これを行うようになったとき、私は手動で呼び出しを追加しました。最初は気が遠くなると思いましたが、私の場合はそれほど悪くはありませんでした。ログに記録するメソッドの種類は非常に限られていました(COMと通信するメソッド)。

于 2012-05-30T15:59:12.603 に答える