2017-09-27 23 views
3

我有一個名爲LogException的Visual Basic方法,它在發生TRY..CATCH故障時將信息寫入我的例外數據庫。該方法具有以下參數:如何在Visual Basic中獲得子類名稱

  1. methodLocation;
  2. methodName;
  3. 異常;

當我調用該方法,我會用下面的代碼:

_ex.LogException(
    Me.GetType.Name.ToString, 
    MB.GetCurrentMethod.Name.ToString, 
    ex.Message.ToString) 

因此,如果我調用一個類中被稱爲「Insert_Test」方法的代碼名爲「測試」,我會期望第一個參數接收「Test」,第二個參數接收「Insert_Test」,第三個接收來自所拋出異常的確切細節。

只要「Test」類是基類,這一切都可以正常工作。如果「Test」類是一個子類(例如稱爲「BigTest」),則前兩個參數仍將作爲「Test」和「Insert_Test」傳遞。我需要知道的是如何獲取確切的類樹,以便此場景中的第一個參數將作爲「BigTest.Test」來完成。

理想情況下,我希望能夠做到這一點,而不必將任何值硬編碼到我的代碼中,以便代碼可以「按原樣」重新使用。

在此先感謝。

+0

我使用嵌套類 - 我嘗試使用繼承用於其他目的,並不能使它發揮作用。 –

回答

3

你可以使用這樣的功能:

Public Function GetFullType(ByVal type As Type) As String 
    Dim fullType As String = "" 

    While type IsNot GetType(Object) 
     If fullType = "" Then 
      fullType &= type.Name 
     Else 
      fullType = type.Name & "." & fullType 
     End If 

     type = type.BaseType 
    End While 

    Return fullType 
End Function 

,並調用它是這樣的:

GetFullType(Me.GetType)

編輯:這好像OP實際使用嵌套類出現,不繼承類。在這種情況下,我發現this answer應該能夠調整到提供的代碼。

代碼嵌套類:

Shared Function GetFullType(ByVal type As Type) As String 
    Dim fullType As String = "" 

    While type IsNot Nothing 
     If fullType = "" Then 
      fullType &= type.Name 
     Else 
      fullType = type.Name & "." & fullType 
     End If 

     type = type.DeclaringType 
    End While 

    Return fullType 
End Function 
+0

據我所知,仍然只返回實際包含被調用方法的類。在我的測試應用程序中,我構建了一個名爲「TestClass」的類,並在其中放入了另一個名爲「TestClassEmbedded」的類。我把它放到TestClassEmbedded中的方法叫做「TestClassEmbeddedSub」。 如果該方法拋出一個異常,我希望它顯示方法名稱爲「TestClassEmbeddedSub」(我已經可以從System獲得。Reflection.MethodBase.GetCurrentMethod.Name)和方法位置作爲TestClass.TestClassEmbedded。 –

+0

你使用嵌套類還是繼承? –

+0

我發現了一個關於繼承問題的答案,它實際上回答了你的問題。 –

1

如果可能的話,不要自行創造它。例如,我可以猜測MB.GetCurrentMethod()將讀取堆棧跟蹤以確定方法名稱(這很慢!)。

您應該檢查屬性CallerMemberNameCallerFilePath & CallerLineNumber滿足您的需求。它們由編譯器填充,因此不會遇到任何性能問題。

參見: https://blog.codeinside.eu/2013/11/03/caller-information-with-net-4-5-or-who-touched-the-function/

+0

對不起,我應該指定我使用VS2010(甚至不要求),所以我可以參考的最高框架是4.0。 –

相關問題