我使用System.Reflection.Emit在运行时创建实现各种接口的类,这些接口包含方法和属性.

在生成类时,我为类应该实现的每个接口的每个接口方法生成一个具体方法.

由于属性只是语法上的糖,(103)我不以任何方式处理它们:对于任何属性Foo,接口被绑定来声明一对get_Foo()set_Foo()方法,因此我的代码生成相应的具体方法,并且结果类具有该属性而无需任何额外处理.

一切都很正常,除了一件烦人的事:

当作为生成的类的实例的对象显示在Visual Studio调试器的"局部变量"或"自动"窗口中时,如果展开该对象的 node ,则看不到任何属性及其值.它们只是没有被展示出来.他们不在那里.他们似乎并非如此.

现在,有趣的是:如果我在Visual Studio调试器的"Watch"窗口中添加该实例的名称加上一个点加上一个生成的属性的名称,那么调试器就会识别该属性,并向我显示它的值;所以该属性就在那里;但它不会显示在"Locals"或"Autos"下.

是什么导致了这种情况?我怎么才能修好它呢?

推荐答案

事实证明,属性是100个语法糖.

就调用它的任何代码而言,包含get_Foo()set_Foo()的类似乎实现了Foo属性,但除非它显式定义该属性,否则该类并不真正实现Foo属性.

因此,当Visual Studio调试器try 确定要在"本地变量"或"自动"窗口中显示对象的哪些属性时,它会枚举该对象的属性,如果未定义任何属性,则不会显示任何属性.

因此,这个问题的解决方案是,在代码生成期间,除了调用TypeBuilder.DefineMethod()来定义每个方法之外,我们还必须跟踪哪些方法是getter和setter,然后 for each 属性执行TypeBuilder.DefineProperty()并为其指定getter和setter.

严格地说,这不是必需的,但从反射的Angular 来看,生成的类将是完整的,因此它将在调试器中正常运行.

Csharp相关问答推荐

自定义JsonEditor,用于将SON序列化为抽象类

Plotly.NET访问互联网时出现异常

Monty Hall游戏节目模拟给我50/50的结果

WPF Windows初始化正在锁定. Net 8中分离的线程

MAUI查询参数单一字符串项将不起作用

在具有主构造函数的类中初始化属性时出现警告

C#XmlSerializer-输出控制新行的多个XML片段

默认情况下,.NET通用主机(Host.CreateDefaultBuilder)中是否包含UseConsoleLifetime?

Cosmos SDK和Newtonsoft对静态只读记录的可能Mutations

ASP.NET核心MVC SqlException:违反主键约束';PK_USER';.无法在对象';数据库中插入重复的密钥.用户';

如何使用自定义负载均衡器管理Ocelot负载均衡器中的多线程和批读取

取决于您的数据量的多个嵌套循环

反序列化私有成员

对于PowerShell中的ConvertTo-SecureString方法,Microsoft如何将初始化向量添加到AES加密中的安全字符串?

HelperText属性不支持复杂内容(混合C#和标记)

我是否应该注销全局异常处理程序

Autofac -动态实例化:手动传递构造函数

反序列化我以前使用System.Text.Json序列化的文件时出现异常

异步等待,如何在Windows窗体中使用它们?

C#:我需要根据换行符拆分字符串,而不是在字符串中用双引号分隔换行符