我不想再传递 nameof 了

有的时候抛出一个异常,我们需要知道是哪个方法抛出的异常。那么,我们可以通过传递 nameof 来获取调用者的方法名。但是,感觉很烦,每次都要传递 nameof。那么,有没有更好的方法呢?

CallerLineNumberAttribute

获取调用者的行号。

using System; using System.Runtime.CompilerServices;  public static class Program {    public static void Main()    {       TraceMessage("Something happened.");    }     public static void TraceMessage(string message,                         [CallerLineNumber] int sourceLineNumber = 0)    {       Console.WriteLine("Line: {0} - {1}", sourceLineNumber, message);    } } // The example displays the following output: //    Line: 10 - Something happened. 

CallerFilePathAttribute

获取调用者的文件路径。

using System; using System.IO; using System.Runtime.CompilerServices;  public static class Program {    public static void Main()    {       TraceMessage("Something happened.");    }     public static void TraceMessage(string message,                         [CallerFilePath] string sourceFilePath = "")    {       Console.WriteLine("File: {0} - {1}", Path.GetFileName(sourceFilePath), message);    } } // The example displays the following output: //    File: Program.cs - Something happened. 

可发帖可群聊的技术交流方式已经上线,欢迎通过链接,加入我们一起讨论。 https://www.newbe.pro/links/

CallerMemberNameAttribute

获取调用者的方法名。

using System; using System.Runtime.CompilerServices;  public static class Program {    public static void Main()    {       DoProcessing();    }     public static void DoProcessing()    {       TraceMessage("Something happened.");    }     public static void TraceMessage(string message,                         [CallerMemberName] string memberName = "")    {       Console.WriteLine("Member: {0} - {1}", memberName, message);    } } // The example displays the following output: //    Member: DoProcessing - Something happened. 

CallerArgumentExpressionAttribute

获取调用者的参数表达式。C# 10.0 新增。

这个其实很好用,以后再也不用担心 ArgumentException 还需要写一个 nameof 了。

using System; using System.Runtime.CompilerServices;  public static class Program {    public static void Main()    {       int x = 10;       int y = 20;       Assert(x > y, "x > y");    }     public static void Assert(bool condition, [CallerArgumentExpression("condition")] string message = null)    {       Console.WriteLine("Condition: {0} - {1}", condition, message);    } } // The example displays the following output: //    Condition: False - x > y 

总结

通过上面的几个例子,我们可以看到,借助在编译时获取调用者的行号、文件路劲和调用者方法名的特性,我们可以在开发中更加方便的进行日志记录。

参考

感谢您的阅读,如果您觉得本文有用,请点赞、关注和转发。

可发帖可群聊的技术交流方式已经上线,欢迎通过链接,加入我们一起讨论。 https://www.newbe.pro/links/


  1. https://learn.microsoft.com/dotnet/api/system.runtime.compilerservices.callerlinenumberattribute?view=net-7.0&WT.mc_id=DX-MVP-5003606

  2. https://learn.microsoft.com/dotnet/api/system.runtime.compilerservices.callerfilepathattribute?view=net-7.0&WT.mc_id=DX-MVP-5003606

  3. https://learn.microsoft.com/dotnet/api/system.runtime.compilerservices.callermembernameattribute?view=net-7.0&WT.mc_id=DX-MVP-5003606

  4. https://learn.microsoft.com/dotnet/api/system.runtime.compilerservices.callerargumentexpressionattribute?view=net-7.0&WT.mc_id=DX-MVP-5003606

发表评论

相关文章