温故知新,CSharp遇见调用方信息(CallerInfo),通过Attribute、StackTrace获取调用方的信息
前言
有时候,想以最少成本的改造去记录下当前方法调用来自哪个方法,以便获取一些诊断线索。
基于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;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
2021-12-09 乘风破浪,遇见未来元宇宙(Metaverse)之Unity加速布局元宇宙,收购全球顶级特效公司Weta Digital
2021-12-09 乘风破浪,遇见未来元宇宙(Metaverse)之Unity云端分布式算力方案,为大规模实时3D内容需求而生