温故知新,CSharp遇见调用方信息(CallerInfo),通过Attribute、StackTrace获取调用方的信息

前言

有时候,想以最少成本的改造去记录下当前方法调用来自哪个方法,以便获取一些诊断线索。

image

基于Attribute获取调用方的信息

internal class MyClass
{
    public void Test()
    {
        Log();
    }

    public void Log
    (
        [CallerFilePath]string callerFilePath = null, 
        [CallerLineNumber]int callerLineNumber = 0, 
        [CallerMemberName]string callerMemberName = null
    )
    {
        // callerFilePath:D:\CodeSpace\learn\LearnLog.Caller.ConsoleApp\MyClass.cs, callerLineNumber:15, callerMemberName:Test
        Console.WriteLine($"callerFilePath:{callerFilePath}, callerLineNumber:{callerLineNumber}, callerMemberName:{callerMemberName}");
    }
}

基于StackTrace获取调用方的信息

private void LogFatherCallerInfo(int skip = 2)
{
    foreach (var frame in new StackTrace().GetFrames().Skip(skip))
    {
        var methodbase = frame.GetMethod();
        // LearnLog.Caller.ConsoleApp.MyClass.Test
        var fatherCallerInfo = $"{methodbase.DeclaringType.Namespace}.{methodbase.DeclaringType.Name}.{methodbase.Name}";
        Console.WriteLine(fatherCallerInfo);
        break;
    }
}

使用示例

internal class MyClass
{
    public void Test()
    {
        Log();
    }

    public void Log()
    {
        LogFatherCallerInfo();
    }

    private void LogFatherCallerInfo(int skip = 2)
    {
        foreach (var frame in new StackTrace().GetFrames().Skip(skip))
        {
            var methodbase = frame.GetMethod();
            // LearnLog.Caller.ConsoleApp.MyClass.Test
            var fatherCallerInfo = $"{methodbase.DeclaringType.Namespace}.{methodbase.DeclaringType.Name}.{methodbase.Name}";
            Console.WriteLine(fatherCallerInfo);
            break;
        }
    }
}

熟悉MVVM的通知属性的逻辑童鞋

public abstract class ObservableObject : INotifyPropertyChanged, INotifyPropertyChanging
{
    public event PropertyChangedEventHandler? PropertyChanged;

    public event PropertyChangingEventHandler? PropertyChanging;

    protected void OnPropertyChanged([CallerMemberName] string? propertyName = null)
    {
        OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
    }

    protected void OnPropertyChanging([CallerMemberName] string? propertyName = null)
    {
        if (!Configuration.IsINotifyPropertyChangingDisabled)
        {
            OnPropertyChanging(new PropertyChangingEventArgs(propertyName));
        }
    }

    protected bool SetProperty<T>([NotNullIfNotNull("newValue")] ref T field, T newValue, [CallerMemberName] string? propertyName = null)
    {
        if (EqualityComparer<T>.Default.Equals(field, newValue))
        {
            return false;
        }

        OnPropertyChanging(propertyName);
        field = newValue;
        OnPropertyChanged(propertyName);
        return true;
    }
}

参考

posted @   TaylorShi  阅读(95)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
历史上的今天:
2021-12-09 乘风破浪,遇见未来元宇宙(Metaverse)之Unity加速布局元宇宙,收购全球顶级特效公司Weta Digital
2021-12-09 乘风破浪,遇见未来元宇宙(Metaverse)之Unity云端分布式算力方案,为大规模实时3D内容需求而生
点击右上角即可分享
微信分享提示