리플렉션/진단을 통해 메서드 내에서 호출 인스턴스를 가져올 수 있나요?

StackOverflow https://stackoverflow.com/questions/97193

  •  01-07-2019
  •  | 
  •  

문제

메서드 자체에 전달하지 않고 정적 메서드를 호출하는 실제 인스턴스에 대한 참조를 가져오는 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()

@스티브 쿠퍼:확장 방법을 고려하지 않았습니다.그 중 일부 변형이 작동할 수 있습니다.

도움이 되었습니까?

해결책

나는 당신이 할 수 있다고 믿지 않습니다.StackTrace 및 StackFrame 클래스도 이름 지정 정보만 제공할 뿐 인스턴스에 대한 액세스는 제공하지 않습니다.

왜 이 작업을 수행하려는지 정확히 모르겠지만, 수행할 수 있다고 해도 속도가 매우 느릴 수 있다는 점을 알아 두십시오.

더 나은 해결책은 ExecuteMethod를 호출하기 전에 인스턴스를 스레드 로컬 컨텍스트로 푸시하여 그 안에서 검색하거나 인스턴스를 전달하는 것입니다.

다른 팁

메서드를 확장 메서드로 만드는 것을 고려하세요.다음과 같이 정의하십시오.

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

그것은 다음과 같이 호출됩니다:

this.StaticExecute();

당신이 하고 싶은 일을 직접적으로 할 수 있는 방법은 생각나지 않습니다만, 무언가를 발견한다면 정적 메소드(정적 메소드가 없고 인스턴스가 있을 익명 메소드)를 주의 깊게 살펴보라고 제안할 수 있습니다. 자동 생성 클래스가 있는데 조금 이상할 것입니다.

호출 개체를 적절한 매개변수로 전달해야 하는지 궁금합니다.결국, static 이는 이 메소드가 입력 매개변수 이외의 어떤 것에도 의존하지 않는다는 힌트입니다.또한 이 방법은 테스트하기 까다로울 수 있습니다. 작성한 테스트 코드는 실행 중인 시스템과 동일한 호출 개체를 갖지 않기 때문입니다.

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

당신이 하려는 일이 무엇이든 성취할 수 있는 다른 방법을 찾아보세요.

ExecuteMethod가 객체를 취하도록 하세요.그러면 무슨 일이 있어도 인스턴스를 갖게 됩니다.

여기에 뭔가 빠진 것 같은 느낌이 듭니다.정적 메서드는 문자 그대로 어디에서나 호출할 수 있습니다.클래스 A 또는 클래스 B 인스턴스가 호출 스택의 어느 곳에나 나타날 것이라는 보장은 없습니다.

당신이 하려는 일이 무엇이든 성취할 수 있는 더 나은 방법이 있어야 합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top