리플렉션/진단을 통해 메서드 내에서 호출 인스턴스를 가져올 수 있나요?
-
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 인스턴스가 호출 스택의 어느 곳에나 나타날 것이라는 보장은 없습니다.
당신이 하려는 일이 무엇이든 성취할 수 있는 더 나은 방법이 있어야 합니다.