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);
}
我将把当前的 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);
}