C#如何判断是哪个类的那个方法调用了当前方法

平常我们写了一个类,目的是让所有的项目或类来调用,此时我们写生成日志,要明确是哪个类中的那个方法来调用的,以便后面好查询,保留详细的记录。

       public static LogInfo Instance(string path)
        {
            StackTrace trace = new StackTrace();
            //获取是哪个类来调用的
            type = trace.GetFrame(1).GetMethod().DeclaringType;
            //获取是类中的那个方法调用的
            string method = trace.GetFrame(1).GetMethod().ToString()
            return Init(path);
        }

看到这样就完全可以达到目的,其中最关键的是用到了StackTrace类

下面看到生成的日志

2016-08-05 13:53:35,849[9] ERROR NetLog.Form1  测试一下:随便记录一条

2016-08-05 13:53:35,853[9] ERROR NetLog.Form1  发生异常:输入字符串的格式不正确。
这时候我们就可以看到是在命名空间为NetLog下的Form1这个类调用的

如果还想看到是具体那个方法调用的了

2016-08-05 14:34:58,948[9] ERROR NetLog.Form1  [Void button1_Click(System.Object, System.EventArgs)]测试一下:随便记录一条

2016-08-05 14:35:03,266[9] ERROR NetLog.Form1  [Void button1_Click(System.Object, System.EventArgs)]发生异常:输入字符串的格式不正确。
可以看到是void button1_Click(object sender, EventArgs e)这个方法调用的

方法的返回值void

方法的名称button1_Click

方法的参数sender,e

namespace System.Diagnostics
{
    // 摘要:
    //     表示一个堆栈跟踪,它是一个或多个堆栈帧的有序集合。
    [Serializable]
    [ComVisible(true)]
    public class StackTrace
    {
        // 摘要:
        //     定义要从堆栈跟踪中省略的默认方法数。此字段为常数。
        public const int METHODS_TO_SKIP = 0;

        // 摘要:
        //     用调用方的帧初始化 System.Diagnostics.StackTrace 类的新实例。
        public StackTrace();
        //
        // 摘要:
        //     用调用方的帧初始化 System.Diagnostics.StackTrace 类的新实例,可以选择捕获源信息。
        //
        // 参数:
        //   fNeedFileInfo:
        //     如果为 true,则捕获文件名、行号和列号;否则为 false。
        public StackTrace(bool fNeedFileInfo);
        //
        // 摘要:
        //     使用提供的异常对象初始化 System.Diagnostics.StackTrace 类的新实例。
        //
        // 参数:
        //   e:
        //     从其构造堆栈跟踪的异常对象。
        //
        // 异常:
        //   System.ArgumentNullException:
        //     参数 e 为 null。
        public StackTrace(Exception e);
        //
        // 摘要:
        //     从调用方的帧初始化 System.Diagnostics.StackTrace 类的新实例,跳过指定的帧数。
        //
        // 参数:
        //   skipFrames:
        //     堆栈中的帧数,将从其上开始跟踪。
        //
        // 异常:
        //   System.ArgumentOutOfRangeException:
        //     skipFrames 参数为负数。
        public StackTrace(int skipFrames);
        //
        // 摘要:
        //     初始化包含单个帧的 System.Diagnostics.StackTrace 类的新实例。
        //
        // 参数:
        //   frame:
        //     System.Diagnostics.StackTrace 对象应包含的帧。
        public StackTrace(StackFrame frame);
        //
        // 摘要:
        //     使用所提供的异常对象初始化 System.Diagnostics.StackTrace 类的新实例,可以选择捕获源信息。
        //
        // 参数:
        //   e:
        //     从其构造堆栈跟踪的异常对象。
        //
        //   fNeedFileInfo:
        //     如果为 true,则捕获文件名、行号和列号;否则为 false。
        //
        // 异常:
        //   System.ArgumentNullException:
        //     参数 e 为 null。
        public StackTrace(Exception e, bool fNeedFileInfo);
        //
        // 摘要:
        //     使用提供的异常对象初始化 System.Diagnostics.StackTrace 类的新实例,并跳过指定的帧数。
        //
        // 参数:
        //   e:
        //     从其构造堆栈跟踪的异常对象。
        //
        //   skipFrames:
        //     堆栈中的帧数,将从其上开始跟踪。
        //
        // 异常:
        //   System.ArgumentNullException:
        //     参数 e 为 null。
        //
        //   System.ArgumentOutOfRangeException:
        //     skipFrames 参数为负数。
        public StackTrace(Exception e, int skipFrames);
        //
        // 摘要:
        //     从调用方的帧初始化 System.Diagnostics.StackTrace 类的新实例,跳过指定的帧数并可以选择捕获源信息。
        //
        // 参数:
        //   skipFrames:
        //     堆栈中的帧数,将从其上开始跟踪。
        //
        //   fNeedFileInfo:
        //     如果为 true,则捕获文件名、行号和列号;否则为 false。
        //
        // 异常:
        //   System.ArgumentOutOfRangeException:
        //     skipFrames 参数为负数。
        public StackTrace(int skipFrames, bool fNeedFileInfo);
        //
        // 摘要:
        //     初始化特定线程的 System.Diagnostics.StackTrace 类的新实例,可以选择捕获源信息。
        //
        // 参数:
        //   targetThread:
        //     请求其堆栈跟踪的线程。
        //
        //   needFileInfo:
        //     如果为 true,则捕获文件名、行号和列号;否则为 false。
        //
        // 异常:
        //   System.Threading.ThreadStateException:
        //     targetThread 线程未暂停。
        public StackTrace(Thread targetThread, bool needFileInfo);
        //
        // 摘要:
        //     使用提供的异常对象初始化 System.Diagnostics.StackTrace 类的新实例,跳过指定的帧数并可以选择捕获源信息。
        //
        // 参数:
        //   e:
        //     从其构造堆栈跟踪的异常对象。
        //
        //   skipFrames:
        //     堆栈中的帧数,将从其上开始跟踪。
        //
        //   fNeedFileInfo:
        //     如果为 true,则捕获文件名、行号和列号;否则为 false。
        //
        // 异常:
        //   System.ArgumentNullException:
        //     参数 e 为 null。
        //
        //   System.ArgumentOutOfRangeException:
        //     skipFrames 参数为负数。
        public StackTrace(Exception e, int skipFrames, bool fNeedFileInfo);

        // 摘要:
        //     获取堆栈跟踪中的帧数。
        //
        // 返回结果:
        //     堆栈跟踪中的帧数。
        public virtual int FrameCount { get; }

        // 摘要:
        //     获取指定的堆栈帧。
        //
        // 参数:
        //   index:
        //     所请求的堆栈帧的索引。
        //
        // 返回结果:
        //     指定的堆栈帧。
        public virtual StackFrame GetFrame(int index);
        //
        // 摘要:
        //     返回当前堆栈跟踪中所有堆栈帧的副本。
        //
        // 返回结果:
        //     System.Diagnostics.StackFrame 类型的数组,表示堆栈跟踪中的函数调用。
        [ComVisible(false)]
        public virtual StackFrame[] GetFrames();
        //
        // 摘要:
        //     生成堆栈跟踪的可读表示形式。
        //
        // 返回结果:
        //     堆栈帧的可读表示形式。
        public override string ToString();
    }
}


你可能感兴趣的:(C#)