2008-09-18 3 views
9

System.Reflection, System.Diagnostics 또는 다른 방법을 통해 메서드 자체에 전달하지 않고 정적 메서드를 호출하는 실제 인스턴스에 대한 참조를 가져올 수 있습니까? 이 라인리플렉션/진단을 통해 메소드 내에서 호출 인스턴스를 가져올 수 있습니까?

class A 
{ 
    public void DoSomething() 
    { 
     StaticClass.ExecuteMethod(); 
    } 
} 

class B 
{ 
    public void DoSomething() 
    { 
     SomeOtherClass.ExecuteMethod(); 
    } 
} 
public class SomeOtherClass 
{ 
    public static void ExecuteMethod() 
    { 
     // Returns an instance of A if called from class A 
     // or an instance of B if called from class B. 
     object caller = getCallingInstance(); 
    } 
} 

내가 System.Diagnostics.StackTrace.GetFrames를 사용하여 유형을 얻을 수 있지만, 실제 인스턴스에 대한 참조를 얻을 수있는 방법이 함께

예를 들어

무엇인가?

정적 호출과 정적 호출뿐만 아니라 리플렉션과 성능 문제를 알고 있으며, 일반적으로이 문제에 접근하는 올바른 방법이 아니라 일반적으로 거의 통틀어서입니다. 이 질문의 이유 중 일부는 그것이 가능하다면 나는 호기심이었다. 현재 인스턴스를 전달 중입니다.

ExecuteMethod(instance) 

그리고 이것이 가능한지 여전히 궁금해하고 인스턴스에 계속 액세스 할 수있게되었습니다.

ExecuteMethod() 

@ 스티브 쿠퍼 : 내가 확장 방법을 고려하지 않았다. 그것의 약간 변이는 작동 할지도 모르다.

답변

4

나는 너를 믿을 수 없다. StackTrace 및 StackFrame 클래스조차 인스턴스에 대한 액세스가 아닌 이름 지정 정보 만 제공합니다.

나는 왜 당신이 이것을하고 싶은지 정확히 모르겠지만 그것을 할 수 있다고해도 매우 느릴 것입니다.

더 좋은 해결책은 ExecuteMethod를 호출하기 전에 인스턴스를 스레드 로컬 컨텍스트로 밀어 넣는 것입니다. ExecuteMethod를 호출하거나 인스턴스를 전달하기 만하면됩니다.

1

ExecuteMethod에서 개체를 가져 오면됩니다. 그렇다면 인스턴스가 무엇이든 상관 없습니다.

8

확장 메서드를 만드는 것이 좋습니다.

public static StaticExecute(this object instance) 
{ 
    // Reference to 'instance' 
} 

그것은 같이 호출됩니다 :로 정의

this.StaticExecute(); 

내가 직접 수행 할 작업을 할 수있는 방법을 생각할 수 없다,하지만 난 제안 만 할 수 있습니다 당신이 뭔가를 발견하면 그 , 당신은 정적 메소드를 가지지 않을 것이고, 익명 메소드는 자동 생성 클래스의 인스턴스를 가질 것이다. 이것은 약간 이상 할 것이다.

적절한 매개 변수로 호출하는 개체를 전달해야하는지 궁금합니다. 결국 static은이 메소드가 입력 매개 변수 이외의 다른 것에 의존하지 않는다는 힌트입니다. 또한이 메소드는 테스트 할 코드가 아니므로 작성한 테스트 코드는 실행중인 시스템과 동일한 호출 객체를 갖지 않으므로주의해야합니다.

+1

이것은이 문제를 해결하는 매우 우아한 방법입니다. – ohmusama

0

나는 뭔가를 놓치고있는 것처럼 느껴진다. 정적 메서드는 문자 그대로 어디에서나 호출 할 수 있습니다. 클래스 A 또는 클래스 B 인스턴스가 호출 스택의 어느 곳에 나 나타날 것이라는 보장은 없습니다.

당신이하려는 일을 성취 할 수있는 더 좋은 방법이 있어야합니다.

1

정적 메서드를 호출하는 정적 메서드의 경우에는 호출 인스턴스가 없습니다.

시도하려는 작업을 수행하는 다른 방법을 찾으십시오.

관련 문제