私は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リターン「」の代わりに期待「ベース」
の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
おそらく、「静的に決定されたタイプ」は、「知覚された」タイプよりも優れた名前になります。値(フィールドの型、パラメータの型、メソッド/プロパティの戻り値の型など)を取得した場所から取得します。 –