2012-08-02 69 views
0

我不太確定如何最好問這個問題,所以請隨時編輯獲取類/方法名稱...調用一個共同的功能

我已經使用了包含常用功能的「實用工具」類貫穿我的申請。我的一個方法記錄產生的異常這樣的:

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方法中發生異常的類/方法的上下文。從長遠來看,這將使我的事情變得更加清潔。

回答

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); 
0

您可以使用StackTrace Class。看看那個和你的問題非常相似的例子。

2

請注意,frame.GetMethod().DeclaringType可以返回null:前一段時間我面臨這個問題只在發佈使用NLog loggerGetCurrentClassLogger)建立我的應用程序的。不能完全記住這種情況。順便說一下,它是known issue

Apache log4net有一個有趣的技巧,它允許檢測來電者信息(類,方法等)。

請看看:

  1. LocationInfo類(source) - 主叫用戶位置信息的內部表示。

    public class LocationInfo 
    { 
        ... 
    
        public LocationInfo(Type callerStackBoundaryDeclaringType) 
        { 
         // Here is the trick. See the implementation details here. 
        } 
    
        ... 
    } 
    
  2. LogImpl類(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); 
        } 
    
        ... 
    } 
    
相關問題