我不想再传递 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↩
目录
相关文章
|
算法 数据挖掘 Python
使用python实现FP-Growth算法
使用python实现FP-Growth算法
758 0
|
数据处理 计算机视觉 Python
【目标检测】指定划分COCO数据集训练(车类,行人类,狗类...)
【目标检测】指定划分COCO数据集训练(车类,行人类,狗类...)
6423 0
|
11月前
|
消息中间件 缓存 NoSQL
【Redis进阶】不止是缓存!Redis的5种核心数据结构与实战场景全解析
本文深入浅出地解析了Redis五大核心数据结构:String、Hash、List、Set和ZSet,结合图解与实战场景,涵盖缓存、计数器、分布式锁、购物车、消息队列、排行榜等典型应用,助你摆脱“只会SET/GET”的困境,真正发挥Redis的高性能潜力。
|
11月前
|
数据采集 人工智能 安全
什么是数据治理?数据治理对企业有什么用?
在数字经济时代,数据成为核心生产要素。本文系统解析数据治理的定义、价值与实施路径,涵盖金融、医疗、政务等四大行业实践,推荐国产与国际主流平台,并展望AI原生、国产化适配、低代码协作三大趋势,助力企业实现从合规到创新的价值跃迁。
字节流与字符流的差异
【10月更文挑战第13天】总的来说,字节流和字符流各有其特点和适用范围,我们需要根据具体的需求来选择使用哪种类型的流。在实际应用中,还需要注意编码问题、性能优化等方面,以确保数据的正确处理和高效传输。
1096 155
|
JSON 人工智能 前端开发
JSON基础知识与实践
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,基于JavaScript语言的子集,具有易读、易解析和跨语言等优点。它广泛应用于前后端数据交换、API设计、配置文件存储及移动应用开发等场景。JSON数据由键值对构成,支持字符串、数值、布尔值、数组和对象等类型,结构清晰且可嵌套,适合网络传输。自2001年由Douglas Crockford提出后,JSON因其简洁性和灵活性逐渐成为互联网主流数据格式之一,并被标准化为ECMA-404。
918 0
|
机器学习/深度学习 资源调度 自然语言处理
循环神经网络RNN完全解析:从基础理论到PyTorch实战1
循环神经网络RNN完全解析:从基础理论到PyTorch实战
3389 0
|
人工智能 安全 数据安全/隐私保护
HarmonyOS应用开发实战:基于ArkTS的开箱即用登录页面实现【样式方式实现①】【HarmonyOS 5.0(Next)】
本文介绍了基于HarmonyOS 5.0(Next)和ArkTS实现的开箱即用登录页面。HarmonyOS 5.0是华为于2024年10月22日发布的第三代移动操作系统,具备原生智能、互联、安全及流畅特性。文章详细解析了使用ArkTS开发登录页面的代码,涵盖组件定义、界面布局、事件处理、样式设置及异步操作等内容,展示了清晰的组件结构、响应式设计与模块化编程的优势。通过这段代码,开发者可以快速上手并构建高效、美观的应用界面。
|
NoSQL 数据库 Redis
如何保证MQ幂等性?或 如何防止消息重复消费?
如何保证MQ幂等性?或 如何防止消息重复消费?