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

有帮助吗?

解决方案

请尝试使用此功能。

System.Reflection.MethodBase.GetCurrentMethod().Name

C#没有像C ++那样的 __ LINE __ __ FUNCTION __ 宏,但有等价的

其他提示

我目前使用的是这样的功能:

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的解决方案

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

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

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

System.Reflection.MethodBase.GetCurrentMethod().Name

这是在.NET 4.5中添加的。

请参阅@ roken的回答:

C#中是否存在__LINE__ __FILE__等效项?

我用这个:

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

用法示例:

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

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

s_log.Debug("CallerName");

HTH ..

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top