我不想再传递 nameof 了

简介: 有的时候抛出一个异常,我们需要知道是哪个方法抛出的异常。那么,我们可以通过传递 nameof 来获取调用者的方法名。但是,感觉很烦,每次都要传递 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
目录
相关文章
|
3月前
|
人工智能 测试技术 API
谁说 WebSocket 调试难?Windows 上的“秘密武器”都在这儿,速占先机
从 Apifox 这样集大成者,到 Websocat 这样专注于命令行极致体验的工具,再到 WebSocket King 的开源灵活,以及 Postman 的广泛适用性和 WebSocket.org Toolkit 的即时性,它们共同构成了 WebSocket 开发生态的重要支撑。
|
存储 编译器 Linux
匿名结构体类型、结构体的自引用、结构体的内存对齐以及结构体传参
匿名结构体类型、结构体的自引用、结构体的内存对齐以及结构体传参
226 0
|
机器学习/深度学习 人工智能 算法
人工智能在医疗诊断中的应用与挑战
本文探讨了人工智能(AI)在医疗诊断领域的应用及其面临的挑战。随着技术的不断进步,AI已经在医学影像分析、疾病预测和个性化治疗等方面展现出巨大潜力。然而,数据隐私、算法透明度以及临床整合等问题仍然是亟待解决的关键问题。本文旨在通过分析当前AI技术在医疗诊断中的具体应用案例,探讨其带来的优势和潜在风险,并提出相应的解决策略,以期为未来AI在医疗领域的深入应用提供参考。
391 3
|
11月前
|
人工智能 自然语言处理 开发工具
Languine:专为开发者设计的 AI 多语言翻译工具,快速生成100+种语言的准确翻译,简化应用程序的 i18n 国际化配置
Languine 是一款面向开发者的 AI 翻译工具,支持 100+ 种语言,自动化翻译流程,提升多语言应用开发效率。
469 15
Languine:专为开发者设计的 AI 多语言翻译工具,快速生成100+种语言的准确翻译,简化应用程序的 i18n 国际化配置
|
机器学习/深度学习 算法 数据可视化
基于WOA优化的CNN-LSTM-Attention的时间序列回归预测matlab仿真
该文介绍了使用优化后的深度学习模型(基于CNN、LSTM和Attention机制)进行时间序列预测,对比了优化前后的效果,显示了性能提升。算法在MATLAB2022a中实现,利用WOA(鲸鱼优化算法)调整模型超参数。模型通过CNN提取局部特征,LSTM处理序列依赖,Attention机制关注相关历史信息。核心程序展示了WOA如何迭代优化及预测过程,包括数据归一化、网络结构分析和预测误差可视化。
|
存储 关系型数据库 MySQL
一文读懂AnalyticDB MySQL过滤条件智能下推原理
在常规认知中,过滤条件肯定是推的越靠近底层越好,将尽可能多的过滤条件更贴近存储层数据源,以使查询时能跳过无关的数据,但是过滤条件下推到存储层一定会快吗?
|
机器学习/深度学习 人工智能 供应链
供应链管理系统有哪些?
1万字干货分享,国内外 20款 供应链管理软件都给你讲的明明白白。如果你还不知道怎么选择,一定要翻到第三大段,这里我将会通过8年的软件产品选型经验告诉你,怎么样才能快速选到适合自己的软件工具。
|
存储 数据安全/隐私保护 开发者
iOS创建苹果证书、p12证书申请流程
iOS创建苹果证书、p12证书申请流程
iOS创建苹果证书、p12证书申请流程
|
XML Java 测试技术
使用 JMeter 进行 Performance Testing 指北
使用 JMeter 进行 Performance Testing 指北
使用 JMeter 进行 Performance Testing 指北