使用反射来记录错误的最佳方式


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

返回类似的内容

MyClass.ThisMethod:错误就是废话。。

现在,

1)MethodBase.GetCurrentMethod().DeclaringType.Name能够抛出CCD_。如何避免这种情况?或者,知道currentmethod所在的类的好方法是什么?

2) 还有其他方法可以做到这一点吗?

对于错误事件日志记录,甚至对于应用程序函数或方法完成日志记录,反射调用的性能通常不是问题。特别是因为使用反射调用通常比在每个类和方法中使用命名字符串更可取。

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

例如。日志(m_zClassName,zMethodName,"Method Wizbot completed.");

基准

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

改进

也就是说,通过而不是两次调用MethodBase.GetCurrentMethod(),OP发布的代码可以显著提高性能,因为我们想要的是同一对象的两个成员。

OP的代码(带有一些格式)在两个MethodBase.GetCurrentMethod()调用中=约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和字段分隔符。

我们可以使用堆栈跟踪

Using System.Diagnostics;
// get call stack
StackTrace stackTrace = new StackTrace();
// get calling method name
Console.WriteLine(stackTrace.GetFrame(1).GetMethod().Name);

从"如何找到调用当前方法的方法?"?

最新更新