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

  • 相关阅读:
    快鲸scrm:助力企业快速破解“无效私域”难题
    JavaScript实现登录框定位
    小白也能搞通UDP通信(88E1111 RGMII 接口)
    IK分词器详解
    限制LitstBox控件显示指定行数的最新数据(3/3)
    IDEA本机连接远程TDengine不成功,终于配置成功
    【区域生长】代码
    【论文阅读】(2023TPAMI)PCRLv2
    nginx优先级和匹配方式
    在T3开发板上实现SylixOS最小系统(0)—— 写在前面的话
  • 原文地址:https://www.cnblogs.com/newbe36524/p/0x01D-I-don-t-want-to-pass-nameof-anymore.html