属性名 作用 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 -------------------- 主程序结束