多态类的函数求值



我正在使用MDBG示例制作一个托管.NET调试器。

MDBG示例仅在给定实例的顶级类上操作,而不在类层次结构内部进行深层搜索。我能够遍历层次结构并获得所有可用的方法。但在这种情况下会出现一个问题:

    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
    }

问题是,当我将castedToBase作为ICorDebugValue并查询它的ICorDebugValue2::GetExactType时,我会得到一个类,而不是基类。在这一点上,我无法再区分调用哪个方法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
        );

将对象投射到它的基类不会改变对象的类型,只会改变它的感知方式。我建议您需要将"感知"类型与值一起传递,并使用它而不是实际类型来找到正确的方法。

"感知"类型是基于从哪里获得值而静态确定的类型。

  • 如果使用ICorDebugILFrame::GetArgument()从参数中获取值,则从方法签名中提取相应的参数类型。
    • 如果它是第一个参数,并且方法签名具有HasThis标志而没有ExplicitThis标志,则改为从值中获取类型
  • 如果使用ICorDebugILFrame::GetLocalVariable()从local获取值,则从方法locals签名中提取类型(locals签名的元数据令牌需要从方法头中提取(
  • 如果您通过运行具有ICorDebugEval的方法(例如属性getter(获得值,那么您应该使用您调用的方法的返回类型(也从方法签名中提取(
  • 如果从字段中获取值,则从字段签名中提取类型
  • 如果您强制转换了一个值,则使用要强制转换的任何类型

相关内容

  • 没有找到相关文章

最新更新