System.Reflection.Emit生成类的属性在VS调试器中不显示问题求助
问题原因与解决方案
原因分析
你只实现了接口属性对应的get_Foo()和set_Foo()方法,但没有在动态生成的类上添加属性的元数据。
Visual Studio调试器的“Locals”/“Autos”窗口只会识别类自身显式定义的属性元数据;而“Watches”窗口会通过方法命名规则(比如get_Foo对应Foo属性)反向推断属性,所以能正常显示。接口的属性定义属于接口的元数据,不会自动继承到实现类的元数据中——你实现了方法,但类本身并没有告诉CLR“我有一个Foo属性”,调试器自然不会在对象节点下展示它。
解决方法
在生成动态类时,不仅要实现属性对应的get/set方法,还要为每个属性显式创建属性元数据,并将对应的方法关联到属性上。
具体步骤
- 遍历目标接口的
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); } } - 即使是显式实现接口方法(方法名格式为
接口全名.get_Foo),依然可以将其关联到属性元数据,不影响调试器识别。
完成上述操作后,生成的类就拥有了自身的属性元数据,调试器的“Locals”/“Autos”窗口就能正常展开显示属性及其值。
内容的提问来源于stack exchange,提问作者Mike Nakis
相关产品推荐
相关产品推荐

