You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

System.Reflection.Emit生成类的属性在VS调试器中不显示问题求助

问题原因与解决方案

原因分析

你只实现了接口属性对应的get_Foo()和set_Foo()方法,但没有在动态生成的类上添加属性的元数据。

Visual Studio调试器的“Locals”/“Autos”窗口只会识别类自身显式定义的属性元数据;而“Watches”窗口会通过方法命名规则(比如get_Foo对应Foo属性)反向推断属性,所以能正常显示。接口的属性定义属于接口的元数据,不会自动继承到实现类的元数据中——你实现了方法,但类本身并没有告诉CLR“我有一个Foo属性”,调试器自然不会在对象节点下展示它。

解决方法

在生成动态类时,不仅要实现属性对应的get/set方法,还要为每个属性显式创建属性元数据,并将对应的方法关联到属性上。

具体步骤

  1. 遍历目标接口的PropertyInfo集合,在生成get/set方法后,为类添加属性元数据:
    foreach (var propInfo in interfaceType.GetProperties(BindingFlags.Public | BindingFlags.Instance))
    {
        // 执行你原有的逻辑,生成get_Foo和set_Foo方法
        MethodBuilder getMethod = ...; // 你的get方法生成代码
        MethodBuilder setMethod = ...; // 你的set方法生成代码
    
        // 为动态类创建属性元数据
        PropertyBuilder propBuilder = typeBuilder.DefineProperty(
            propInfo.Name,
            PropertyAttributes.None,
            propInfo.PropertyType,
            null);
    
        // 将生成的get/set方法绑定到属性上
        propBuilder.SetGetMethod(getMethod);
        if (propInfo.CanWrite)
        {
            propBuilder.SetSetMethod(setMethod);
        }
    }
    
  2. 即使是显式实现接口方法(方法名格式为接口全名.get_Foo),依然可以将其关联到属性元数据,不影响调试器识别。

完成上述操作后,生成的类就拥有了自身的属性元数据,调试器的“Locals”/“Autos”窗口就能正常展开显示属性及其值。

内容的提问来源于stack exchange,提问作者Mike Nakis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 00:59:57