【C#】三个特殊的 Caller Info Attributes
属性名 作用 CallerMemberName 这个属性会自动捕获调用方法的名称,它常用于简化依赖属性(Dependency Properties)或实现 INotifyPropertyChanged
接口时的代码。CallerFilePath
这个属性会自动获取调用该方法的源文件的完整路径。 CallerLineNumber 当一个方法的参数被该属性标记时,编译器会把调用该方法的代码行号作为整数传递给这个参数。 CallerMemberName例子:
public class ViewModel : INotifyPropertyChanged {public event PropertyChangedEventHandler PropertyChanged;private string _firstName;public string FirstName{get => _firstName;set{_firstName = value;OnPropertyChanged("FirstName"); // ⚠️ 这里需要手动传入字符串}}protected void OnPropertyChanged(string propertyName){PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));} }
using System.ComponentModel; using System.Runtime.CompilerServices;public class ViewModel : INotifyPropertyChanged {public event PropertyChangedEventHandler PropertyChanged;private string _firstName;public string FirstName{get => _firstName;set{_firstName = value;// ✅ 编译器会自动填充 "FirstName"OnPropertyChanged();}}// 🏆 编译器在编译时自动传入调用它的成员名称protected void OnPropertyChanged([CallerMemberName] string propertyName = null){PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));} }
CallerFilePath例子:
using System.Runtime.CompilerServices;public static class Logger {public static void LogInfo(string message,[CallerFilePath] string sourceFilePath = ""){// 打印文件路径和消息Console.WriteLine($"文件: {sourceFilePath}");Console.WriteLine($"消息: {message}");Console.WriteLine("--------------------");} }// 在 Program.cs 文件中调用 public class Program {public static void Main(){Logger.LogInfo("这是一条测试日志。");} }
输出结果:
输出结果(部分路径可能会根据你的实际情况变化): 文件: C:\Projects\MyProject\Program.cs 消息: 这是一条测试日志。 --------------------
CallerLineNumber:
using System.Runtime.CompilerServices;public static class Logger {public static void LogDebug(string message,[CallerLineNumber] int lineNumber = 0){// 打印行号和消息Console.WriteLine($"行号: {lineNumber}");Console.WriteLine($"消息: {message}");Console.WriteLine("--------------------");} }// 在 Program.cs 文件中调用 public class Program {public static void Main(){Console.WriteLine("主程序开始");Logger.LogDebug("检查点 1"); // 假设这行代码在第 15 行// 更多的代码...Logger.LogDebug("检查点 2"); // 假设这行代码在第 20 行Console.WriteLine("主程序结束");} }
输出结果:
输出结果(行号可能会根据你的实际情况变化): 主程序开始 行号: 15 消息: 检查点 1 -------------------- 行号: 20 消息: 检查点 2 -------------------- 主程序结束