可以在参数中传递类名/方法名吗?

时间:2014-02-19 04:07:17

标签: c# logging

我已经创建了一个方法,将异常记录到名为Logs的文件夹中,并将其保存在文本文件中。文本输出的格式如下:

Main thread has thrown an exception @ ClassName::MethodName : Exception.ToString();

ClassName::MethodName是一个文本,应该包含哪个类和哪个方法抛出它(在执行任务时)。怎么可能传递这些论点?例如,如果我有一个名为“Test”的类,并且我有这个方法:

public void DoSomething() {
    try {
        this.Name = "Test";
    } catch (Exception e) {
        MainForm.Instance.LogException(e);
    }

然后,如果抛出异常,将传递并显示参数Test::DoSomething。怎么可能在C#中做到?

4 个答案:

答案 0 :(得分:2)

您可以使用Reflection ..

public void DoSomething() {
    try {
        this.Name = "Test";
    } catch (Exception e) {
        var method = System.Reflection.MethodBase.GetCurrentMethod();
        var methodName = method.Name;
        var className = method.ReflectedType.Name;
        MainForm.Instance.LogException(String.Format("{0} - {1}:{2}", className, methodName, e));
    }

答案 1 :(得分:1)

该异常具有StackTrace属性,该属性为您提供尽可能多的信息,告知抛出异常的位置。

答案 2 :(得分:1)

您可以使用以下代码:

 public static void DoSomething()
        {
            try
            {
                throw new InvalidOperationException("Exception");
            }
            catch (Exception e)
            {
                StackTrace stackTrace = new StackTrace();

                StackFrame stackFrame = stackTrace.GetFrame(0);

                Console.WriteLine("Class Name: {0}, Method Name: {1}", stackFrame.GetMethod().Module, stackFrame.GetMethod().Name);


            }
        }

答案 3 :(得分:0)

e.StackTrace.GetFrame(0)会为您提供最新的StackFrame

鉴于此,e.StackTrace.GetFrame(0).GetMethod()将为您提供MethodBase的实例,从此实例中,您可以获取方法名称和类