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

返回类似的东西

MyClass.ThisMethod :错误是胡说八道..

现在,

1)MethodBase.GetCurrentMethod().DeclaringType.Name能够投掷NullReferenceException. 如何避免这种情况?或者知道当前方法所在的类的好方法是什么?

2)有没有其他方法可以达到同样的效果?

4

2 回答 2

3

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

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

例如。日志(m_zClassName,zMethodName,“方法 Wizbot 完成。”);

基准

在我的 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 和字段分隔符。

于 2013-08-12T01:59:52.960 回答
0

我们可以使用堆栈跟踪

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

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

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

于 2012-11-21T15:56:13.393 回答