4

C# で呼び出し関数の名前を取得する必要があります。私はstackframeメソッドについて読みましたが、どこでも信頼性が低く、パフォーマンスが低下していると述べています。

しかし、本番用に必要です。トレースが呼び出されたメソッドの名前もログに記録するカスタム トレーサを作成しています。

誰かが呼び出し元の関数名を取得する効率的な方法を手伝ってくれませんか? Visual Studio 2010 を使用しています。

4

3 に答える 3

12

c# 5 にアップグレードして使用するCallerMemberName

public void Method([CallerMemberName] string caller="")
{
}

編集

c# 5 のその他の良い点

public void Method([CallerMemberName] string name="",
                   [CallerLineNumber] int line=-1,
                   [CallerFilePath] string path="")
{
}
于 2012-08-23T18:58:01.427 に答える
9

.NET 3.5以降でLBの回答に記載されているC#4.5属性は、宣言するだけで使用できます(vs2012以降を使用してコンパイルする必要があります。そうしないと、エラーは発生しませんが、パラメーター値はnullのままになります!):

namespace System.Runtime.CompilerServices
{
  [AttributeUsageAttribute(AttributeTargets.Parameter, Inherited = false)]
  public sealed class CallerMemberNameAttribute : Attribute
  {
  }

  [AttributeUsageAttribute(AttributeTargets.Parameter, Inherited = false)]
  public sealed class CallerFilePathAttribute : Attribute
  {
  }

  [AttributeUsageAttribute(AttributeTargets.Parameter, Inherited = false)]
  public sealed class CallerLineNumberAttribute : Attribute
  {
  }
}
于 2012-10-23T08:24:09.433 に答える
7

次のようなことができます:

 var stackTrace = new StackTrace();
 var name = stackTrace.GetFrame(1).GetMethod().Name;

フレームワーク/言語のどのバージョンでも動作します。

于 2012-08-23T18:57:40.233 に答える