C#:如何在我的代码中缩短 MethodBase.GetCurrentMethod().DeclaringType.Name?

C#: How to shorten MethodBase.GetCurrentMethod().DeclaringType.Name inside my code?

我将把当前的 class 名称作为参数传递给代码中的一些函数。

我的代码中有很多这样的调用:

return Ok(new WebServiceResult(ErrorCodes.ERROR_CODE_MINUS_002_INVALID_REQUEST_DATE,
          MethodBase.GetCurrentMethod().DeclaringType.Name));

部分 MethodBase.GetCurrentMethod().DeclaringType.Name 用于 return 当前 class 的名称。

如何使用 C# 语法缩短此 MethodBase.GetCurrentMethod().DeclaringType.Name

我在 C/C++ 中寻找类似宏的东西,例如:

#define CLASSNAME MethodBase.GetCurrentMethod().DeclaringType.Name

但 C# 和 it is not a good practice in C# 似乎不支持宏,如果我理解正确的话。 但是,为了使我的代码更清晰、更易读,我正在寻找一些东西来替换此代码段并使其更短。

P.S。我不想在被调用方法本身中获取调用 class 的名称,但我正在寻找一种方法来缩短我的代码并使其更清晰。

最接近的概念可能是 using 指令。它可能会根据您的要求缩短通话时间

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/using-directive

希望对您有所帮助

如果这是为了记录,我会考虑使用 attributes to insert the file-name。如果您为每个 class 使用一个文件,并且您可能应该这样做,它提供了一种类似的方式来发现 log-message 的来源。使用这些属性将使编译器在编译时插入参数,使其比使用反射快得多。

示例

public void TraceMessage(string message,
        [System.Runtime.CompilerServices.CallerMemberName] string memberName = "",
        [System.Runtime.CompilerServices.CallerFilePath] string sourceFilePath = "",
        [System.Runtime.CompilerServices.CallerLineNumber] int sourceLineNumber = 0)
{
    System.Diagnostics.Trace.WriteLine("message: " + message);
    System.Diagnostics.Trace.WriteLine("member name: " + memberName);
    System.Diagnostics.Trace.WriteLine("source file path: " + sourceFilePath);
    System.Diagnostics.Trace.WriteLine("source line number: " + sourceLineNumber);
}

如果必须有实际的 class 名称,此方法将不可行。一种可能的解决方法是使用单独的静态方法来检查 find the calling method 的调用堆栈,从而允许您提供更短的方法。检查调用堆栈会有点慢,但涉及反射的一切都有些慢。请记住将您的辅助方法标记为 non-inlinable:[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]

使用 nameof 定义一个 class 常量。编译器检查此名称是否存在。重命名重构也会在 nameof.

中更改此名称
public class MyClass
{
    private const string ClassName = nameof(MyClass);
}