__FUNCTION__宏的C#版本

时间:2008-11-03 18:38:11

标签: c# .net macros

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

6 个答案:

答案 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)

这是在.NET 4.5中添加的。

请参阅@ roken的回答:

Do __LINE__ __FILE__ equivalents exist in C#?

答案 5 :(得分:1)

我用这个:

public static string CallerName([CallerMemberName] string callerName = "")
{
    return callerName;
}

用法示例:

s_log.DebugFormat("{0}", CallerName());

使用它的缺点是每次要打印来电者姓名时,都需要跳转到功能==>耗时&性能打击! 因此,我将它用于调试perpose,如果我还需要在生产代码中打印,我通常会将函数名称内联到log.Debug中,例如:

s_log.Debug("CallerName");

HTH ..