1、使用StackTrace实现
using System; using System.Diagnostics; namespace demo { public class 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 class with its namespace:" + callerClassNameWithNamespace); } } class 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 class 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('-', '>'); } } class 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('-', '>');
}