有没有人对C ++ __FUNCTION__宏的C#版本有一个很好的解决方案?编译器似乎不喜欢它。
答案 0 :(得分:20)
请尝试使用此功能。
System.Reflection.MethodBase.GetCurrentMethod().Name
C#没有像C ++那样的__LINE__
或__FUNCTION__
宏,但有等价物
答案 1 :(得分: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)的solution。
答案 2 :(得分:6)
不幸的是,C#中没有该宏的等效版本。我不认为GetCurrentMethodName()解决方案等效于C ++ __FUNCTION__宏。也就是说,因为C ++版本是名称的编译时计算。对于C#,这是一个运行时计算,会导致性能下降。
我没有对成本的严重程度做出任何分析,但有一个
答案 3 :(得分:4)
以下内容应该有效,尽管它将在运行时而不是在编译期间进行评估。
System.Reflection.MethodBase.GetCurrentMethod().Name
答案 4 :(得分:2)
答案 5 :(得分:1)
我用这个:
public static string CallerName([CallerMemberName] string callerName = "")
{
return callerName;
}
用法示例:
s_log.DebugFormat("{0}", CallerName());
使用它的缺点是每次要打印来电者姓名时,都需要跳转到功能==>耗时&性能打击! 因此,我将它用于调试perpose,如果我还需要在生产代码中打印,我通常会将函数名称内联到log.Debug中,例如:
s_log.Debug("CallerName");
HTH ..