2016-08-08 4 views
3

私は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 
     ); 
+1

オブジェクトをその基本クラスにキャストしても、オブジェクトは変更されません。どのように認識されるかのみです。私はあなたが値と一緒に "知覚"型を渡す必要があり、正しいメソッドを見つける目的のために実際の型の代わりに使用することをお勧めします。 –

+0

@BrianReichleありがとうございました!しかし、私は "知覚された"タイプを持っていない、どのようなキャストがオブジェクトで実行されたかをデバッガが知るべきか? – 3615

+0

おそらく、「静的に決定されたタイプ」は、「知覚された」タイプよりも優れた名前になります。値(フィールドの型、パラメータの型、メソッド/プロパティの戻り値の型など)を取得した場所から取得します。 –

答えて

3

は、それが知覚されるだけか、オブジェクトの種類を変更しません。私はあなたが値と一緒に "知覚"型を渡す必要があり、正しいメソッドを見つける目的のために実際の型の代わりに使用することをお勧めします。

「知覚される」タイプは、値を取得した場所に基づいて静的に決定されるタイプです。

  • ICorDebugILFrame::GetArgument()を使用してパラメータから値を取得した場合は、メソッドのシグネチャから対応する引数型を抽出します。
    • 最初の引数とメソッドシグネチャのフラグがHasThisで、フラグがExplicitThisではない場合は、代わりに値から型を取得します。
  • もしICorDebugILFrame::GetLocalVariable()を使用してローカルの値を持っている場合あなたが得た場合の方法を地元の署名(地元署名のメタデータトークンはメソッドヘッダから抽出される必要がある。)
  • からタイプを抽出します値がICorDebugEvalのメソッドを実行することから(例えばプロパティゲッター)、呼び出されたメソッドの戻り値の型を使用する必要があります(メソッドシグネチャからも抽出されます)。
  • フィールドから値を取得した場合は、フィールドのシグネチャからの型
  • 値をキャストする場合は、キャストするタイプを使用します。
+0

ありがとう、Brian!あなたの答えは、疑いの海に溺れないように私を救っています。私は今あなたの意見を得るようになってきていると思いますが、これを試して私がどこに行くのかを見てみるのに時間が必要です。概念レベルで不明な点は、キャストに関する最後の段落です。その場合、解析するシグネチャ/フィールドシグネチャはありません。したがって、どこからタイプするのですか? – 3615

+0

これは、ある時点で、デバッガで式を評価するときにキャストをサポートしたいという前提で投げ込まれただけです。例えば。 '((A)castedToBase).SomeProp' ...おそらくそれについて心配するのは時期尚早です:) –

+0

はい、あなたは正しいです、あなたが言及したようないくつかの表現を入力する場合はdefenetelyについて考えて早すぎる!私が考えていたのは、デバッガの表現ではなく、コードでキャストされたものでした。 'var castedToBase =(Base)a;'のように、 'castedToBase.SomeProp'を実行するデバッガのプロパティを評価したいだけです。現在、私はフィールドとプロパティの評価に固執しています。 – 3615