2017-09-27 6 views
3

TRY..CATCH가 실패한 경우 정보를 내 Exception 데이터베이스에 쓰는 LogException이라는 Visual Basic 메서드가 있습니다. 그 방법은 다음의 파라미터를 갖는다 :Visual Basic에서 하위 클래스 이름을 얻는 방법

  1. methodLocation;
  2. methodName;
  3. 예외; 내가 방법을 호출 할 때

, 나는 다음과 같은 코드를 사용합니다 : 나는 "테스트"라는 클래스 내에서 "Insert_Test"라는 방법이 코드를 호출하는 경우, 따라서

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

를 I 첫 번째 매개 변수는 "Test"를 받고 두 번째 매개 변수는 "Insert_Test"를 받고 세 번째 매개 변수는 throw 된 예외에서 정확한 세부 정보를 수신 할 것으로 기대합니다.

"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)

편집 : 영업 이익은 실제로 중첩 클래스를 사용하는 것처럼 그것은 나타납니다, 상속되지 수업. 그런 경우에 제공된 코드로 조정할 수 있어야합니다 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"입니다. 메서드가 예외를 throw하는 경우 메서드 이름을 "TestClassEmbeddedSub"로 표시해야합니다 (이미 System에서 가져올 수 있음).Reflection.MethodBase.GetCurrentMethod.Name) 및 메서드 위치를 TestClass.TestClassEmbedded으로 설정합니다. –

+0

중첩 클래스 또는 상속을 사용하고 있습니까? –

+0

실제로 귀하의 질문에 답하는 상속에 관한 질문에 대한 답변을 찾았습니다. –

1

이 자신에 의해, 그것을 발명하지 않습니다. 예를 들어, MB.GetCurrentMethod()이 stacktrace를 읽어 메소드 이름을 결정할 것이라고 추측 할 수 있습니다 (속도가 느림!).

속성이 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입니다. –

관련 문제