获取调用公共函数的类/方法名称

时间:2012-08-02 16:56:20

标签: c# .net visual-studio-2010 logging typeof

我不太确定如何最好地提出这个问题,所以请随时编辑...

我有一个" Utilities"包含整个应用程序中使用的常用功能的类。我的一种方法记录了这样的exeptions:

internal static void logExeption(Type typeOfClass, string methodName, Exception exeption )
 {
   //Do some logging here
 }

然后,每当我发现异常时,我都想在整个应用程序中调用它:

try{
  //perform some action
}
catch(Exception ex)
{
Utils.logExeption(this.GetType(), System.Reflection.MethodBase.GetCurrentMethod().Name, ex);
 }

我想知道是否有一种方法可以避免传递前两个参数,并且只是找出类别/方法的上下文,其中异常源自 logException 方法。从长远来看,这将使我的事情变得更加清洁。

3 个答案:

答案 0 :(得分:4)

所以你想确定调用对象和函数。虽然不建议它可以实现。使用System.Diagnostics.StackTrace来遍历堆栈;然后获得适当的StackFrame一级。然后通过在该StackFrame上使用GetMethod()来确定调用者是哪个方法。请注意,构建堆栈跟踪是一项可能很昂贵的操作,并且您的方法的调用者可能会模糊实际来自哪里。

StackFrame frame = new StackFrame(1);
MethodBase method = frame.GetMethod();
string message = String.Format("{0}.{1} : {2}",
method.DeclaringType.FullName, method.Name, message);
Console.WriteLine(message);

答案 1 :(得分:2)

请注意,frame.GetMethod().DeclaringType可以返回null:前一段时间我只在使用NLog logger GetCurrentClassLogger的应用程序的发布版本上遇到此问题}})。记不清楚的情况。顺便说一下,它是known issue

Apache log4net中有一个有趣的技巧,它允许检测来电者信息(类,方法等)。

请看一下:

  1. LocationInfo class(source) - 来电者位置信息的内部表示。

    public class LocationInfo
    {
        ...
    
        public LocationInfo(Type callerStackBoundaryDeclaringType)
        {
            // Here is the trick. See the implementation details here.
        }
    
        ...
    }
    
  2. LogImpl class(source) - 记录器实现类 - ILogger接口的包装器 - 执行技巧它不能被子类化

    public class LogImpl : LoggerWrapperImpl, ILog
    {
        ...
        public LogImpl(ILogger logger) : base(logger)
        {
            ...
        }
    
        /// <summary>
        /// The fully qualified name of this declaring type not the type of any subclass.
        /// </summary>
        private readonly static Type ThisDeclaringType = typeof(LogImpl);
    
        virtual public void Error(object message, Exception exception)
        {
            Logger.Log(ThisDeclaringType, m_levelError, message, exception);
        }
    
        ...
    }
    

答案 2 :(得分:0)

您可以使用StackTrace Class。请参阅那里与您的问题非常相似的示例。