2014-06-24 4 views
-1

class-namecaller info attributes으로 가져 오는 방법.클래스 이름 얻기

I strongly say a no 리플렉션을 사용하여 클래스 이름을 기록하십시오.

 private void Log(string logMessage, [CallerMemberName]string callerName = null) 
     { 
      if (logger.IsDebugEnabled) 
      { 
       logger.DebugFormat("Executing Method = {1};{0}", logMessage, callerName); 
      } 
     } 

방법 발신자 정보 속성을 사용하여 class name 여기에 로그인 할 때 :

이 (가) [CallerMemberName] 다음과 같이 사용하여 메소드 이름을 얻을 수 있었나요?

답변

3

사용할 수있는 속성이 없습니다. 그러나 Log은 private이기 때문에 외부 클래스는이 함수를 호출 할 수 없으므로 클래스를 호출 한 클래스를 이미 알고 있습니다.

public SomeClass 
{ 

    //(snip) 

    private void Log(string logMessage, [CallerMemberName]string callerName = null) 
    { 

     if (logger.IsDebugEnabled) 
     { 
      string className = typeof(SomeClass).Name; 

      logger.DebugFormat("Executing Method = {1};{2}.{0}", logMessage, callerName, className); 
     } 
    } 
} 
5

무엇보다도,이 방법은이 경우에 이것은 typeof(T).FullNametypeof(T).Name 또는 속성을 사용하여 발견 될 수 있으므로, 단지 현재의 클래스를 사용하는 것 전용이다. 아래 그림과 같이

당신이 여기 시도 할 수하는 방법은 대중 있다면, 다른 클래스를 위해 일하는 것이 프로그래밍 방식으로 스택 프레임에서 클래스 이름을 찾을 수 있습니다 :

private void Log(string logMessage) 
{ 
    StackFrame frame = new StackFrame(1, false); 
    MethodBase method = frame.GetMethod(); 
    Type declaringType = method.DeclaringType; 

    // Log declaringType.FullName or other property 
} 
당신은 더 많은 정보를 찾을 수 있습니다

StackFrame에 here 및 MethodBase here

당신이 할 수있는 다른 방법은 기록 할 유형에 유형 매개 변수가 있습니다. 그러나 기록 할 유형을 전달하지만 방법은 공개 여야합니다 이 수업 외부에서 전화해야하는 경우 :

public void Log(string logMessage, Type classType) 
{ 
    // Log message and class name 
} 

희망이 있습니다.

+0

디버거가 연결되지 않은 릴리스 빌드를 사용할 때'StackFrame'은 신뢰할 수 없습니다. 메소드 인라인과 같은 것들은 코드가 존재한다고 생각하는 것 외의 다른 곳에 코드가있는 것처럼 보이게 할 수 있습니다. –

+0

사실, 신뢰할 수 있으려면 NoInlining으로 설정해야합니다. 나는이 점을 잊었다 - 고마워. –