__FUNCTION__宏的C#版本

Fil*_*ącz 14 .net c# macros

有没有人对C++ __FUNCTION__宏的C#版本有一个很好的解决方案?编译器似乎不喜欢它.

Eoi*_*ell 21

请尝试使用它.

System.Reflection.MethodBase.GetCurrentMethod().Name
Run Code Online (Sandbox Code Playgroud)

C#不具有__LINE____FUNCTION__像C++宏,但也有等效

  • 由于这个是顶级的并且被接受,你/某人可以添加:System.Reflection.MethodBase.GetCurrentMethod().ToString()也会产生params,因此它在重载和System.Reflection.MethodBase.GetCurrentMethod面前不会模棱两可().DeclaringType.ToString()给出C名称(&namespace) (5认同)

Mar*_*oth 8

我目前使用的是这样的函数:

using System.Diagnostics;

public string __Function() {
    StackTrace stackTrace = new StackTrace();
    return stackTrace.GetFrame(1).GetMethod().Name;
}
Run Code Online (Sandbox Code Playgroud)

当我需要__FUNCTION__时,我只是调用__Function().例如:

Debug.Assert(false, __Function() + ": Unhandled option");
Run Code Online (Sandbox Code Playgroud)

当然这个解决方案也使用反射,但它是我能找到的最佳选择.由于我只将它用于调试(而不是在发布版本中进行跟踪),因此性能损失并不重要.

我想我应该做的是创建调试函数并用它们标记它们

[ Conditional("Debug") ]
Run Code Online (Sandbox Code Playgroud)

相反,但我还没有解决这个问题.

感谢Jeff Mastry 解决这个问题.


Jar*_*Par 6

不幸的是,C#中没有该宏的等效版本.我不认为GetCurrentMethodName()解决方案等效于C++ __FUNCTION__宏.也就是说,因为C++版本是名称的编译时计算.对于C#,这是一个运行时计算,会导致性能下降.

我没有对成本的严重程度做任何假设,但有一个


e.J*_*mes 5

以下内容应该可以工作,尽管它将在运行时而不是编译期间进行评估。

System.Reflection.MethodBase.GetCurrentMethod().Name
Run Code Online (Sandbox Code Playgroud)