2010-06-22 2 views

답변

370
public class SomeClass 
{ 
    public void SomeMethod() 
    { 
     StackFrame frame = new StackFrame(1); 
     var method = frame.GetMethod(); 
     var type = method.DeclaringType; 
     var name = method.Name; 
    } 
} 

의가이 같은 다른 클래스가 있다고 가정 해 봅시다 :

public class Caller 
{ 
    public void Call() 
    { 
     SomeClass s = new SomeClass(); 
     s.SomeMethod(); 
    } 
} 

이름 일 "전화"및 유형 "발신자"입니다 것

UPDATE는 2 년 후 이후 나는 아직도 이것에 upvotes를 얻고있다

에서. 넷 4.5 거기에 이제는이 작업을 훨씬 쉽게 할 수 있습니다. 당신은 앞의 예와 함께가는 CallerMemberNameAttribute

을 이용할 수 있습니다 : 그것은 현재의 스택 트레이스 데이터, 및 반사의 조합을 사용하여 수행 할 수있는 무언가가 실제로

public class SomeClass 
{ 
    public void SomeMethod([CallerMemberName]string memberName = "") 
    { 
     Console.WriteLine(memberName); //output will be name of calling method 
    } 
} 
+1

깨끗하고 요점! – AieshaDot

+9

이것은 얻을 수있는 좋은 해결책이지만, JIT 메서드 인라이닝을 사용하지 않으면 릴리스 빌드에서 예상 한 답을 반환하지 않는다는 것을 기억해야합니다. –

+0

@Greg Beech : 참. 나는 어떤 유형의 릴리스 빌드에서도 리플렉션을 사용하지 않기 때문에 여기서는 문제가되지 않습니다. –

7

예, 프린시 페에서 가능하지만 무료로 제공되지는 않습니다.

StackTrace을 만들어야 호출 스택의 StackFrame's을 볼 수 있습니다.

20

StackTrace을 사용하면 반사 형을 얻을 수 있습니다. 이제

StackTrace stackTrace = new StackTrace();   // get call stack 
StackFrame[] stackFrames = stackTrace.GetFrames(); // get method calls (frames) 

StackFrame callingFrame = stackFrames[1]; 
MethodInfo method = callingFrame.GetMethod(); 
Console.Write(method.Name); 
Console.Write(method.DeclaringType.Name); 
+0

관련 https://stackoverflow.com/questions/171970/how-can-i-find-the-method-that-called-the-current-method – Pakk

10

입니다.

public void MyMethod() 
{ 
    StackTrace stackTrace = new System.Diagnostics.StackTrace(); 
    StackFrame frame = stackTrace.GetFrames()[1]; 
    MethodInfo method = frame.GetMethod(); 
    string methodName = method.Name; 
    Type methodsClass = method.DeclaringType; 
} 

StackFrame 배열에 1 지수는 스택 트레이스를 사용하여, 당신에게 MyMethod

6

기술적라는 방법을 줄 것이다, 그러나 이것은 매우 느리고 예상 답변 당신에게 많이 제공하지 않습니다 시간. 이는 릴리스 빌드 중에 특정 메소드 호출을 제거하는 최적화가 발생할 수 있기 때문입니다. 따라서 stacktrace가 "올바른지"여부를 릴리스에서 확인할 수 없습니다.

정말, C#에서이 작업을 수행하는 확실한 방법이나 빠른 방법은 없습니다. 필요한 이유와 응용 프로그램을 설계 할 수있는 방법을 스스로 묻는 것이 좋습니다. 그래서 어떤 메서드를 호출할지 모르는 상태에서 원하는 것을 할 수 있습니다.

+1

이것은 A. 디버그 빌드이고 B. 다른 어셈블리를 호출합니다. System.Diagnostics.Process를 통해 다른 프로그램을 시작하는 데 걸리는 시간은 StackFrame 클래스를 사용하여 발생하는 모든 것을 축소시킵니다. –

+0

테스트 스위트의 자동 구성을 위해이 작업을 수행하고 있습니다. –

관련 문제