有人对 C++ __FUNCTION__ 宏的 C# 版本有很好的解决方案吗?编译器似乎不喜欢它。
问问题
16455 次
6 回答
23
尝试改用它。
System.Reflection.MethodBase.GetCurrentMethod().Name
C# 没有__LINE__
或没有__FUNCTION__
像 C++ 这样的宏,但有等价物
于 2008-11-03T18:41:58.837 回答
8
我目前使用的是这样的功能:
using System.Diagnostics;
public string __Function() {
StackTrace stackTrace = new StackTrace();
return stackTrace.GetFrame(1).GetMethod().Name;
}
当我需要 __FUNCTION__ 时,我只需调用 __Function() 即可。例如:
Debug.Assert(false, __Function() + ": Unhandled option");
当然,这个解决方案也使用反射,但它是我能找到的最佳选择。因为我只将它用于调试(而不是在发布版本中跟踪),所以性能影响并不重要。
我想我应该做的是创建调试函数并用
[ Conditional("Debug") ]
相反,但我还没有解决这个问题。
感谢 Jeff Mastry 对此的解决方案。
于 2008-12-02T15:08:05.710 回答
6
不幸的是,在 C# 中没有该宏的等效版本。我不认为 GetCurrentMethodName() 解决方案等同于 C++ __FUNCTION__ 宏。即因为 C++ 版本是名称的编译时计算。对于 C#,这是一个运行时计算,会导致性能下降。
我没有对成本的严重性做出任何假设,但有一个
于 2008-11-03T18:42:16.807 回答
5
以下应该可以工作,尽管它将在运行时而不是在编译期间进行评估。
System.Reflection.MethodBase.GetCurrentMethod().Name
于 2008-11-03T18:42:15.857 回答
3
我用这个:
public static string CallerName([CallerMemberName] string callerName = "")
{
return callerName;
}
使用示例:
s_log.DebugFormat("{0}", CallerName());
使用它的缺点是每次要打印调用者姓名时,都需要跳转到函数 ==> 耗时 & 性能下降!因此,我将它用于调试目的,如果我还需要在生产代码中打印,我通常将函数名称内联到 log.Debug 中,例如:
s_log.Debug("CallerName");
HTH..
于 2015-06-30T07:46:43.900 回答
2
于 2015-09-02T00:19:59.007 回答