首页 .Net .Net Core(C#) 使用StackTrace或StackFrame获取方法的调用者方法所在类的类名

.Net Core(C#) 使用StackTrace或StackFrame获取方法的调用者方法所在类的类名

1、使用StackTrace实现

using System;
using System.Diagnostics;
namespace demo
{
    public >OtherClass
    {
        public void OtherMethod()
        {
            string callerClassName = new StackFrame(1).GetMethod().DeclaringType.Name;
            string callerClassNameWithNamespace = new StackFrame(1).GetMethod().DeclaringType.FullName;
            Console.WriteLine("调用者方法:" + callerClassName);
            Console.WriteLine("This is the only name of your >>Program
    {
        static void Main(string[] args)
        {
            new OtherClass().OtherMethod();
            Console.WriteLine("Hello World!"); ;
        }
    }
}

输出结果:

调用者方法所在类的类名:Program
调用者方法所在类的带有命名空间的类名:demo.Program

2、使用StackFrame实现

using System;
using System.Diagnostics;
namespace demo
{
    public >OtherClass
    {
        public void OtherMethod()
        {
            string callerClassName = new StackFrame(1).GetMethod().DeclaringType.Name;
            string callerClassNameWithNamespace = new StackFrame(1).GetMethod().DeclaringType.FullName;
            OtherClass.GetStackTraceModelName();
            Console.WriteLine("调用者方法所在类的类名:" + callerClassName);
            Console.WriteLine("调用者方法所在类的带有命名空间的类名:" + callerClassNameWithNamespace);
        }
      public  static string GetStackTraceModelName()
        {
            //当前堆栈信息
            System.Diagnostics.StackTrace st = new System.Diagnostics.StackTrace();
            System.Diagnostics.StackFrame[] sfs = st.GetFrames();
            //过虑的方法名称,以下方法将不会出现在返回的方法调用列表中
            string _filterdName = "ResponseWrite,ResponseWriteError,";
            string _fullName = string.Empty, _methodName = string.Empty;
            for (int i = 1; i < sfs.Length; ++i)
            {
                //非用户代码,系统方法及后面的都是系统调用,不获取用户代码调用结束
                if (System.Diagnostics.StackFrame.OFFSET_UNKNOWN == sfs[i].GetILOffset()) break;
                _methodName = sfs[i].GetMethod().Name;//方法名称
                                                      //sfs[i].GetFileLineNumber();//没有PDB文件的情况下将始终返回0
                if (_filterdName.Contains(_methodName)) continue;
                _fullName = _methodName + "()->" + _fullName;
                Console.WriteLine(" File: {0}", sfs[i].GetFileName());                                                //文件名
                Console.WriteLine(" Method: {0}", sfs[i].GetMethod().Name);                                 //函数名
                Console.WriteLine(" Line Number: {0}", sfs[i].GetFileLineNumber());                  //文件行号,需要项目有调试需要的PDB文件,否则就返回0
                Console.WriteLine(" Column Number: {0}", sfs[i].GetFileColumnNumber());
                Console.WriteLine(" DeclaringType FullName: {0}", sfs[i].GetMethod().DeclaringType.FullName);
            }
            st = null;
            sfs = null;
            _filterdName = _methodName = null;
            return _fullName.TrimEnd('-', '>');
        }
    }
    >Program
    {
        static void Main(string[] args)
        {
            new OtherClass().OtherMethod();
            OtherClass.GetStackTraceModelName();
            Console.ReadKey();
        }
    }
}

输出结果:

File:
Method: OtherMethod
Line Number: 0
Column Number: 0
File:
Method: Main
Line Number: 0
Column Number: 0
调用者方法所在类的类名:Program
调用者方法所在类的带有命名空间的类名:demo.Program
File:
Method: Main
Line Number: 0
Column Number: 0

3、使用StackTrace获取堆栈信息(文件名、行号、函数名、列号)

命名空间System.Diagnostics

1) 获取当前的堆栈信息

StackTrace st = new StackTrace(new StackFrame(true));
StackFrame sf = st.GetFrame(0);
Console.WriteLine(" File: {0}", sf.GetFileName());                                                //文件名
Console.WriteLine(" Method: {0}", sf.GetMethod().Name);                                 //函数名
Console.WriteLine(" Line Number: {0}", sf.GetFileLineNumber());                  //文件行号,需要项目有调试需要的PDB文件,否则就只能返回0
Console.WriteLine(" Column Number: {0}", sf.GetFileColumnNumber());

public static string GetStackTraceModelName()

{

//当前堆栈信息

System.Diagnostics.StackTrace st = new System.Diagnostics.StackTrace();

System.Diagnostics.StackFrame[] sfs = st.GetFrames();

//过虑的方法名称,以下方法将不会出现在返回的方法调用列表中

string _filterdName = "ResponseWrite,ResponseWriteError,";

string _fullName = string.Empty, _methodName = string.Empty;

for (int i = 1; i < sfs.Length; ++i)

{

//非用户代码,系统方法及后面的都是系统调用,不获取用户代码调用结束

if (System.Diagnostics.StackFrame.OFFSET_UNKNOWN == sfs[i].GetILOffset()) break;

_methodName = sfs[i].GetMethod().Name;//方法名称

//sfs[i].GetFileLineNumber();//没有PDB文件的情况下将始终返回0

if (_filterdName.Contains(_methodName)) continue;

_fullName = _methodName + "()->" + _fullName;

Console.WriteLine(" File: {0}", sfs[i].GetFileName()); //文件名

Console.WriteLine(" Method: {0}", sfs[i].GetMethod().Name); //函数名

Console.WriteLine(" Line Number: {0}", sfs[i].GetFileLineNumber()); //文件行号,需要项目有调试需要的PDB文件,否则就返回0

Console.WriteLine(" Column Number: {0}", sfs[i].GetFileColumnNumber());

Console.WriteLine(" DeclaringType FullName: {0}", sfs[i].GetMethod().DeclaringType.FullName);

}

st = null;

sfs = null;

_filterdName = _methodName = null;

return _fullName.TrimEnd('-', '>');

}

特别声明:本站部分内容收集于互联网是出于更直观传递信息的目的。该内容版权归原作者所有,并不代表本站赞同其观点和对其真实性负责。如该内容涉及任何第三方合法权利,请及时与824310991@qq.com联系,我们会及时反馈并处理完毕。