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



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

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

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

部分MethodBase.GetCurrentMethod().DeclaringType.Name用于返回当前类的名称。

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

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

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

但是在C#中似乎不支持宏,如果我理解正确的话,这在C#中也不是一个好的实践。然而,为了使我的代码更加清晰易读,我正在寻找一些东西来替换这个片段并使其更短。

附言:我不想在被调用的方法中获取调用类的名称,但我正在寻找一种缩短代码并使其更加清晰的方法。

使用nameof定义类常量。编译器检查此名称是否存在。重命名重构也会在nameof中更改此名称。

public class MyClass
{
private const string ClassName = nameof(MyClass);
}

如果这是用于日志记录,我会考虑使用属性来插入文件名。如果每个类使用一个文件,并且可能应该使用,那么它提供了一种类似的方法来发现日志消息的来源。使用这些属性将使编译器在编译时插入参数,使其比使用反射快得多。

示例

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);
}

如果必须具有实际的类名,则这种方法是不可行的。一个可能的解决方法是使用一个单独的静态方法来检查调用堆栈以找到调用方法,从而允许您提供一个较短的方法。检查调用堆栈会有些慢,但涉及反射的所有操作都有些慢。只需记住将您的helper方法标记为不可内联:[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]

相关内容

  • 没有找到相关文章

最新更新