C# 获取调用链

121 阅读1分钟

关键代码

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Log
{
    public class LogHelper
    {
        public static void GetMethodInfo(int index)
        {
            index++;//由于我是封装了方法,相当于上端想要获取本身,其实对于这里而言,上端的本身就是这里的上端,所以需要+1,以此类推
            var stack = new StackTrace(true);

            //0是本身,1是调用方,2是调用方的调用方...以此类推
            var method = stack.GetFrame(index).GetMethod();//想要获取关于方法的信息,可以自己断点调试这里

            var dataList = new Dictionary<string, string>();
            var module = method.Module;
            dataList.Add("模块", module.Name);
            var deClearType = method.DeclaringType;
            dataList.Add("命名空间", deClearType.Namespace);
            dataList.Add("类名", deClearType.Name);
            dataList.Add("完整类名", deClearType.FullName);
            dataList.Add("方法名", method.Name);
            var stackFrames = stack.GetFrames();
            dataList.Add("调用链", string.Join(" -> ", stackFrames.Select((r, i) =>
            {
                if (i == 0) return null;
                var m = r.GetMethod();
                return $"{m.DeclaringType.FullName}.{m.Name}";
            }).Where(r => !string.IsNullOrWhiteSpace(r)).Reverse()));

           for(int i=0;i<dataList.Count();i++)
            {
                var r = dataList.ElementAt(i) ;
                Console.WriteLine($"{r.Key}{r.Value}");
            }
        }
    }
}

测试

image.png

Program 调用 a , a调用b

image.png