MDBG 샘플을 사용하여 관리되는 .NET 디버거를 만들고 있습니다.다형성 클래스의 Func-eval
MDBG 샘플은 내부 클래스 계층 구조를 검색하지 않고 지정된 인스턴스의 최상위 클래스에서만 작동합니다. 나는 계층 구조를 거쳐 가능한 모든 방법을 얻을 수있었습니다. 그러나 문제는 경우에 발생합니다 내가 대신 기본 클래스의 클래스를 얻을 ICorDebugValue으로 쿼리가 ICorDebugValue2의 위해 :: GetExactType castedToBase를 받고있을 때
public abstract class Base{
public Base() {SomeProp = "Base"}
public string SomeProp {get;set;}
}
public class A : Base{
public Base() {SomeProp = "A"}
public new string SomeProp {get;set;}
}
public static void Main(){
var a = new A();
var castedToBase = (Base)a;
//castedToBase.SomeProp -- expect result to be "Base" when debugging
}
문제입니다. 그 시점에서 나는 어떤 메소드 get_SomeProp을 호출 할지를 더 이상 구별 할 수 없다. ICorDebugValue2 :: GetExactType을 고려하여 캐스트를 수행하고 항상 기본 유형을 반환하지 않을 것으로 예상됩니다.
어떤 메소드를 호출해야하는지 어떻게 이해할 수 있습니까?
내가 지금하고있는 코드 중 일부는 다음과 같습니다. mdbgValue은 castedToBase 개체를 나타냅니다. szTypedef는이 감지 된 경우에만 방법은 객체의 유형을 변경하지 않는 기본 클래스의에 객체를 캐스팅 "A"대신 예상 "자료"
IMetadataImport importer;
var classToken = mdbgValue.CorValue.ExactType.Class.Token;
int size;
int ptkExtends;
TypeAttributes pdwTypeDefFlags;
importer.GetTypeDefProps(classToken,
null,
0,
out size,
out pdwTypeDefFlags,
out ptkExtends
);
StringBuilder szTypedef = new StringBuilder(size);
importer.GetTypeDefProps(classToken,
szTypedef,
szTypedef.Capacity,
out size,
out pdwTypeDefFlags,
out ptkExtends
);
개체를 기본 클래스에 캐스팅해도 개체가 변경되지 않고 인식 방법 만 변경됩니다. "인식 된"형식을 값과 함께 전달해야하며 올바른 형식을 찾는 목적으로 실제 형식 대신 해당 형식을 사용해야한다고 제안합니다. –
@BrianReichle 제안 해 주셔서 감사합니다. 하지만 "인식 된"유형이 없으므로 디버거가 객체에 대해 수행 된 캐스트를 알아야합니다. – 3615
아마도 '정적으로 결정된 유형'은 '인식 된'유형보다 더 나은 이름입니다. 값 (필드 유형, 매개 변수 유형, 메소드/특성 리턴 유형 등)이있는 곳이라면 어디에서나 가져올 수 있습니다. –