17

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

4

6 回答 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

这是在 .NET 4.5 中添加的。

在此处查看@roken 的答案:

C# 中是否存在 __LINE__ __FILE__ 等价物?

于 2015-09-02T00:19:59.007 回答