2009-08-07 3 views
3

.NET에서 리플렉션을 사용하여 내 메소드를 호출 한 객체에 액세스하고 싶습니다. 어떻게 든 stacktrace를 볼 수 있다고 가정합니다. 나는 그것이 여러 가지 이유로 안전하지는 않다는 것을 안다. 그러나 나는 단지 일부 속성 값을 붙잡고 목록화할 필요가있다.C# reflection을 사용하여 stacktrace 위로 객체에 액세스

어떻게하면됩니까?

업데이트 : 내가 바보, 난이 C#을

+1

http://stackoverflow.com/a/10530629/8155 –

답변

2

정적 방법은 당신이 무엇을 호출하는 경우에 있던 말을 잊은거야?

발신자와의 계약이 더 나은 (간단한) 계약이 아니겠습니까?

+0

물론 저는 호출하는 라이브러리를 제어 할 수 없습니다. 나는 명령 역사 Launchy 플러그인을 쓰는 중이다. 플러그인 모델은 다소 유연성이 부족하다. 나는 누가 그 부름을 할 것인지를 안다, 나는 그것에 접근하는 어떤 방법이 필요하다. –

2

당신은 "메인"

class Program 
{ 
    static void Main(string[] args){ 
     Func(); 
    } 
    static void Func(){ 
     StackFrame frame = new StackFrame(1); 
     StackTrace trace = new StackTrace(frame); 
     var method = frame.GetMethod(); 
     Console.WriteLine(method.Name); 
    } 
} 
+0

좋은 정보는 그것을 알지 못했다. 하지만 내 메서드를 호출 한 인스턴스에 대한 정보가 필요합니다. –

+0

StackFrame 객체 생성자를 사용하여 호출 스택에 원하는 수준의 정수를 전달해야합니다. 예를 들어, 새로운 StackFrame (1)은 호출자 StackFrame을 의미합니다 (2) 호출자의 호출자는 – bashmohandes

5
var methodInfo = new StackFrame(1).GetMethod(); 
를 인쇄해야 MSDN

http://msdn.microsoft.com/en-us/library/system.diagnostics.stackframe.aspx

이 예이다에서 여기

은 예입니다 스택 트레이스 & StackFrame을 클래스를 사용할 수있다

호출하는 메소드를 반환합니다. 현재 메소드를 편집했습니다.

컴파일러는 메소드에 대한 호출을 인라인하거나 그렇지 않으면 최적화 할 수 있지만 (예상치 못한 동작 인 것처럼 보일 수도 있지만), 예상되는 동작을 방해합니다. 안전을 기하기 위해 메서드를 다음과 같이 꾸미십시오.

[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] 

컴파일러가 작업을 수행하는 것과 반대되는 점에 유의하십시오. 경고.

아차 편집, 난 당신이 방법을 호출 예를를 원하는 것을 알 수있다. 그 정보를 얻을 방법이 없습니다.

+0

응답을 주셔서 감사합니다. 이론적으로 VS 디버거에서 액세스 할 수있는 모든 정보에 액세스 할 수 있어야합니까? 디버거는 메소드를 호출 한 인스턴스에서 스택 프레임을 찾을 수 있습니다. –

+0

이 수준의 세부 사항을 얻으려면 디버거로 프로세스에 연결해야합니다. http://stackoverflow.com/questions/420541/is-there-any-way-to-get-a-reference-to-the-calling-object-in-c를 참조하십시오. –

관련 문제