가능한 중복은 :
How can I find the method that called the current method?리플렉션을 사용하여 호출하는 메소드 이름과 유형을 얻으려면 어떻게해야합니까?
나는 호출하는 메소드의 이름을 얻는 방법 및 호출 방법을 포함하는 클래스의 이름을 쓰고 싶습니다.
C# 반사가 가능합니까?
가능한 중복은 :
How can I find the method that called the current method?리플렉션을 사용하여 호출하는 메소드 이름과 유형을 얻으려면 어떻게해야합니까?
나는 호출하는 메소드의 이름을 얻는 방법 및 호출 방법을 포함하는 클래스의 이름을 쓰고 싶습니다.
C# 반사가 가능합니까?
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
}
}
예, 프린시 페에서 가능하지만 무료로 제공되지는 않습니다.
StackTrace을 만들어야 호출 스택의 StackFrame's을 볼 수 있습니다.
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);
관련 https://stackoverflow.com/questions/171970/how-can-i-find-the-method-that-called-the-current-method – Pakk
입니다.
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
기술적라는 방법을 줄 것이다, 그러나 이것은 매우 느리고 예상 답변 당신에게 많이 제공하지 않습니다 시간. 이는 릴리스 빌드 중에 특정 메소드 호출을 제거하는 최적화가 발생할 수 있기 때문입니다. 따라서 stacktrace가 "올바른지"여부를 릴리스에서 확인할 수 없습니다.
정말, C#에서이 작업을 수행하는 확실한 방법이나 빠른 방법은 없습니다. 필요한 이유와 응용 프로그램을 설계 할 수있는 방법을 스스로 묻는 것이 좋습니다. 그래서 어떤 메서드를 호출할지 모르는 상태에서 원하는 것을 할 수 있습니다.
이것은 A. 디버그 빌드이고 B. 다른 어셈블리를 호출합니다. System.Diagnostics.Process를 통해 다른 프로그램을 시작하는 데 걸리는 시간은 StackFrame 클래스를 사용하여 발생하는 모든 것을 축소시킵니다. –
테스트 스위트의 자동 구성을 위해이 작업을 수행하고 있습니다. –
깨끗하고 요점! – AieshaDot
이것은 얻을 수있는 좋은 해결책이지만, JIT 메서드 인라이닝을 사용하지 않으면 릴리스 빌드에서 예상 한 답을 반환하지 않는다는 것을 기억해야합니다. –
@Greg Beech : 참. 나는 어떤 유형의 릴리스 빌드에서도 리플렉션을 사용하지 않기 때문에 여기서는 문제가되지 않습니다. –