通过函数栈空间获取当前调用函数
时间:2010-09-14 来源:旧木
关于StackTrace的基础可以参见浅析StackTrace(顽强的灰太狼)。
我们在设计日志模块时通常会记录两种信息:
1)软件运行的业务数据
2)软件运行的技术参数(如当前调用的函数堆栈)。
一下通过一下方法可以获取当前调用的函数:
获取调用函数 1 private static string GetCaller()2 {
3 StackTrace stackTrace = new StackTrace(); // get call stack
4 StackFrame[] stackFrames = stackTrace.GetFrames(); // get method calls (frames)
5
6 int i = 1;
7 for (; i < stackFrames.Length; i++)
8 {
9 StackFrame stackFrame = stackFrames[i];
10 if (stackFrame.GetMethod() != null)
11 {
12 string typeName = stackFrame.GetMethod().ReflectedType == null ? stackFrame.GetMethod().Name : stackFrame.GetMethod().ReflectedType.Name;
13 string methodName = stackFrame.GetMethod().Name;
14 if ("LogHelper".Equals(typeName) && ("WriteMessage".Equals(methodName) || "WriteLog".Equals(methodName)))
15 {
16 i++;
17 }
18 else
19 {
20 if (stackFrames.Length >= i + 1)
21 {
22 stackFrame = stackFrames[i];
23 return stackFrame.GetMethod().ReflectedType == null ? stackFrame.GetMethod().Name : stackFrame.GetMethod().ReflectedType.Name + "." + stackFrame.GetMethod().Name;
24 }
25 else
26 {
27 break;
28 }
29 }
30 }
31 }
32
33 return "";
34 }
其中:
if ("LogHelper".Equals(typeName) && ("WriteMessage".Equals(methodName) || "WriteLog".Equals(methodName)))
是用于判断是否为当前日志模块的方法,如果是则忽略。
相关阅读 更多 +