2017-01-24 14 views
1

ExecutingMethodName은 호출자의 메서드 이름을 인쇄하기위한 것입니다. 예 :보조 메서드를 통해 현재 실행중인 메서드 이름을 인쇄하는 방법은 무엇입니까?

  • static void Main(string[] args){Auxiliary.ExecutingMethodName();}은 주를 인쇄해야합니다.

  • static void Foo(){Auxiliary.ExecutingMethodName();}은 Foo를 인쇄해야합니다.

static class Auxiliary 
{ 
    public static void ExecutingMethodName() 
    { 
     Console.WriteLine(new StackFrame(0).GetMethod().Name); 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Auxiliary.ExecutingMethodName();// should print Main 
    } 
    static void Foo() 
    { 
     Auxiliary.ExecutingMethodName();// should print Foo 
    }  
} 

질문

항상 내가 원하는 것이 아니다 그 ExecutingMethodName를 인쇄 위의 현재 구현. 어떻게 보조 메서드를 통해 현재 실행 메서드 이름을 인쇄 할?

답변

2

그냥 (StackFrame(0)이 호출 스택에 currrent 위치 그리고 당신은 한 단계 뒤로 이동해야합니다) 당신의 방법 StackFrame을 호출 1에 0을 변경

public static void ExecutingMethodName() 
{ 
    Console.WriteLine(new StackFrame(1).GetMethod().Name); 
} 
2

는 아래의 코드를 사용합니다. StackFrame(1)을 사용해야하고 StackFrame(2)은 항상 ExecutingMethodName이고 실제로는 ExecutingMethodName의 발신자를 인쇄해야합니다.

public static void ExecutingMethodName() 
     { 
      Console.WriteLine(new StackFrame(1).GetMethod().Name); 
     } 

당신은 C# 5 더 쉽게되었다에서 StackFrame Constructor (Int32)

를 참조 할 수 있습니다.

public static void ExecutingMethodName() 
{ 
    Console.WriteLine(new StackFrame(1).GetMethod().Name); 
} 
3

당신은 (ExecutingMethodName에 속하는) 스택 프레임의 첫 번째 항목을 건너 뛸 수 있습니다. 더 깔끔한 방법.

public static void ExecutingMethodName([CallerMemberName]string callerName= null) 
{ 
    Console.WriteLine(callerName); 
} 
3

사용 StackFrame을에서 CallerMemberNameAttribute를 사용하는 대신 무언가 :

CallerMemberNameAttribute

+0

Voted up. 좋은 생각. 'callerName = null'을 초기화하는 목적은 무엇입니까? –

+1

"CallerMemberName 특성을 기본값이있는 선택적 매개 변수에 적용합니다. 선택적 매개 변수에 대한 명시 적 기본값을 지정해야하며 선택적으로 지정되지 않은 매개 변수에는이 특성을 적용 할 수 없습니다." MSDN 링크에서 제공됩니다. –