博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
浅析StackTrace
阅读量:5884 次
发布时间:2019-06-19

本文共 2679 字,大约阅读时间需要 8 分钟。

 我们在学习函数调用时,都知道每个函数都拥有自己的栈空间。一个函数被调用时,就创建一个新的栈空间。那么通过函数的嵌套调用最后就形成了一个函数调用堆栈。在c#中,使用StackTrace记录这个堆栈。你可以在程序运行过程中使用StackTrace得到当前堆栈的信息。

class Program    {        static void Main(string[] args)        {            Program a = new Program();            a.FuncA();            Console.ReadLine();        }        int FuncA()        {            FuncB();            return 0;        }        private void FuncB()        {            MethodInfo method0 = (MethodInfo)(new StackTrace().GetFrame(0).GetMethod());            MethodInfo method1 = (MethodInfo)(new StackTrace().GetFrame(1).GetMethod());            MethodInfo method2 = (MethodInfo)(new StackTrace().GetFrame(2).GetMethod());                        Console.WriteLine("Current Method is : {0}",method0.Name);            Console.WriteLine("Parent Method is : {0}", method1.Name);            Console.WriteLine("GrandParent Method is : {0}", method2.Name);        }    }

程序的输出结果是:

Current Method is : FuncB
Parent Method is : FuncA
GrandParent Method is : Main
       其中调用GetFrame得到栈空间,参数index 表示栈空间的级别,0表示当前栈空间,1表示上一级的栈空间,依次类推。
       除了可以获取方法信息外,还可以调用StackFrame类的成员函数,在运行时得到代码的文件信息及行号和列号等。详情可以参考msdn上的一个example

// Display the stack frame properties.StackFrame sf = st.GetFrame(i);Console.WriteLine(" File: {0}", sf.GetFileName());Console.WriteLine(" Line Number: {0}",    sf.GetFileLineNumber());// Note that the column number defaults to zero// when not initialized.Console.WriteLine(" Column Number: {0}",    sf.GetFileColumnNumber());if (sf.GetILOffset() != StackFrame.OFFSET_UNKNOWN){   Console.WriteLine(" Intermediate Language Offset: {0}",       sf.GetILOffset());}if (sf.GetNativeOffset() != StackFrame.OFFSET_UNKNOWN){   Console.WriteLine(" Native Offset: {0}",       sf.GetNativeOffset());}

在dudu的文章一文中,就是通过StackTrace得到了其上一级的函数信息,即AddCustomer的信息,来进一步创建SqlParameter 的。详情请参见其文章。

 

自己写的:获得当前方法全名

static string GetCurrentMethodFullName()        {            try            {                int depth = 2;                StackTrace st = new StackTrace();                int maxFrames = st.GetFrames().Length;                StackFrame sf;                string methodName, className;                Type classType;                do                {                    sf = st.GetFrame(depth++);                    classType = sf.GetMethod().DeclaringType;                    className = classType.ToString();                } while (className.EndsWith("Exception") && depth < maxFrames);                methodName = sf.GetMethod().Name;                return className + "." + methodName;            }            catch            {                return null;            }        }

 

转载于:https://www.cnblogs.com/ChineseMoonGod/p/5347094.html

你可能感兴趣的文章
django数据库中的时间格式与页面渲染出来的时间格式不一致的处理
查看>>
Python学习笔记
查看>>
java String
查看>>
DOCKER windows 7 详细安装教程
查看>>
养眼美女绿色壁纸
查看>>
U盘启动盘制作工具箱 v1.0
查看>>
增强myEclipse的提示功能
查看>>
Zabbix汉化方法
查看>>
Java I/O系统基础知识
查看>>
Java多线程设计模式(2)生产者与消费者模式
查看>>
对象并不一定都是在堆上分配内存的
查看>>
刘宇凡:罗永浩的锤子情怀只能拿去喂狗
查看>>
php晚了8小时 PHP5中的时间相差8小时的解决办法
查看>>
JS(JavaScript)的初了解7(更新中···)
查看>>
svn文件管理器的使用
查看>>
Ansible playbook 使用
查看>>
for/foreach/linq执行效率测试
查看>>
js /jquery停止事件冒泡和阻止浏览器默认事件
查看>>
长春理工大学第十四届程序设计竞赛(重现赛)I.Fate Grand Order
查看>>
好作品地址
查看>>