有的时候抛出一个异常,我们需要知道是哪个方法抛出的异常。那么,我们可以通过传递 nameof 来获取调用者的方法名。但是,感觉很烦,每次都要传递 nameof。那么,有没有更好的方法呢?
CallerLineNumberAttribute 获取调用者的行号。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 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); } }
CallerFilePathAttribute 获取调用者的文件路径。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 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); } }
CallerMemberNameAttribute 获取调用者的方法名。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 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); } }
CallerArgumentExpressionAttribute 获取调用者的参数表达式。C# 10.0 新增。
这个其实很好用,以后再也不用担心 ArgumentException 还需要写一个 nameof 了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 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); } }
总结 通过上面的几个例子,我们可以看到,借助在编译时获取调用者的行号、文件路劲和调用者方法名的特性,我们可以在开发中更加方便的进行日志记录。
参考