写点什么

我不想再传递 nameof 了

作者:newbe36524
  • 2023-02-16
    上海
  • 本文字数:1547 字

    阅读完需:约 5 分钟

我不想再传递 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/


发布于: 刚刚阅读数: 6
用户头像

newbe36524

关注

开源项目作者,独立博客维护者 2020-06-02 加入

newbe36524 是一名开发工程师。newbe 是 newbe36524 的个人技术博客。秉承 now everyone will be excellent 的 slogan 希望为开发者们分享自己的开发经验和心路历程。

评论

发布
暂无评论
我不想再传递 nameof 了_C#_newbe36524_InfoQ写作社区