2017-09-27 3 views
3

TRY..CATCHが失敗した場合に、例外データベースに情報を書き込むLogExceptionというVisual Basicメソッドがあります。その方法は、以下のパラメータを有する。Visual Basicでサブクラス名を取得する方法

  1. methodLocation;
  2. methodName;
  3. 例外。

Iメソッドを呼び出すと、私は次のコードを使用します。私が「テスト」と呼ばれるクラス内の「Insert_Test」と呼ばれる方法でこのコードを呼び出した場合、私は、したがって、

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

を最初のパラメータは "Test"を受け取り、2番目のパラメータは "Insert_Test"を受け取り、3番目のパラメータはスローされた例外から正確な詳細を受け取ると期待します。

"Test"クラスが基本クラスである限り、これはすべて正常に機能します。 "Test"クラスがサブクラス(例えば "BigTest"と呼ばれる)である場合、最初の2つのパラメータは引き続き "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)

EDIT: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"という2番目のクラスを追加しました。私がTestClassEmbeddedに入れたメソッドは "TestClassEmbeddedSub"と呼ばれています。 メソッドが例外をスローしていた場合は、メソッド名を "TestClassEmbeddedSub"(これはSystemからすでに取得できます)として表示する必要があります。Reflection.MethodBase.GetCurrentMethod.Name)、およびメソッドの場所はTestClass.TestClassEmbeddedです。 –

+0

ネストされたクラスまたは継承を使用していますか? –

+0

実際にあなたの質問に答える相続に関する質問への回答が見つかりました。 –

1

可能な場合は、自分でそれを発明しないでください。たとえば、私はちょうどMB.GetCurrentMethod()がスタックトレースを読んでメソッド名を決定すると思います(遅いです!)。

属性がCallerMemberNameであるかどうかを確認する必要があります。 CallerFilePath & CallerLineNumberあなたのニーズを満たしてください。これらはコンパイラによって埋め込まれているため、パフォーマンス上の問題は発生しません。

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

+0

申し訳ありませんが、VS2010を使用しています(質問しないでください)ので、私が参照できる最高のフレームワークは4.0です。 –

関連する問題