使用Reflection记录错误的最佳方法

时间:2012-11-20 05:16:03

标签: c# visual-studio-2010 .net-4.0

Log ( MethodBase.GetCurrentMethod().DeclaringType.Name + MethodBase.GetCurrentMethod.Name + "blah blah..."  );

返回类似

的内容
  

MyClass.ThisMethod:错误是等等......

现在,

1)MethodBase.GetCurrentMethod().DeclaringType.Name能够投掷NullReferenceException。怎么避免这个?    或者知道当前方法存在的类的好方法是什么?

2)还有其他方法可以实现同样的目标吗?

2 个答案:

答案 0 :(得分:2)

对于错误事件记录,甚至是应用程序功能或方法完成记录,反射调用的性能通常不是问题。特别是因为通常最好使用反射调用而不是在每个类和方法中都有一个命名字符串。

不应在任何性能关键部分中使用对MethodBase的调用。在这些情况下,如果可能,应在使用之前缓存反射值,或者使用替代对象,例如前面提到的命名字符串。

例如。 Log(m_zClassName,zMethodName,“Method Wizbot completed。”);

<强>基准

在i7-2600k的基准测试中,对MethodBase.GetCurrentMethod()的每次调用大约为1600纳秒(0.0016毫秒)。

<强>改进

话虽如此,OP发布的代码可以通过而不是调用MethodBase.GetCurrentMethod()两次来显着提高性能,因为我们想要的是两个成员相同的对象。

两个MethodBase.GetCurrentMethod()调用中OP的代码(带有一些格式)= ~3200ns:

Log(String.Concat(MethodBase.GetCurrentMethod().DeclaringType.Name, ".", MethodBase.GetCurrentMethod().Name, " : Error is blah blah");

在一个MethodBase.GetCurrentMethod()调用中,只需将对MethodBase对象的引用传递给事件日志写入方法= ~1600ns即可执行两倍的速度:

EventLogWrite(MethodBase.GetCurrentMethod(), "Error is blah blah");

事件日志编写方法:

public static void EventLogWrite(MethodBase methodBase, string zErrorMessage)
{
    string classname = methodBase.DeclaringType.Name;
    string methodname = methodBase.Name;

    string logmessage = String.Concat(classname, ".", methodname, " : ", zErrorMessage);

    // ... write message to event log file
}

另外,使用此设计,您无需在调用事件日志写入方法的每个实例中键入所有String.Concat和字段分隔符。

答案 1 :(得分:0)

我们可以使用堆栈跟踪

Using System.Diagnostics;
// get call stack
StackTrace stackTrace = new StackTrace();

// get calling method name
Console.WriteLine(stackTrace.GetFrame(1).GetMethod().Name);

来自How can I find the method that called the current method?