【C#】三个特殊的 Caller Info Attributes

发布于:2025-09-14 ⋅ 阅读:(20) ⋅ 点赞:(0)
属性名 作用
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
--------------------
主程序结束