在运行时编写和更改代码
本文关键字:代码 运行时 | 更新日期: 2023-09-27 18:35:35
我有一个情况,我想在运行时使用他们的 EditorFor/DisplayFor 模板(或类似的东西)构建 MVC 样式视图。
理想情况下,我们的应用程序将允许用户选择他们想要在他们的 UI 中出现的字段(这样他们就可以根据需要添加/删除任何字段),为此,我认为在运行时创建视图模型类并根据用户选择的内容(即字符串长度、必需等)向它们添加各种数据注释属性会很方便。
我需要能够支持的一件事是在运行时更改生成的类,而不会影响其他用户或必须执行完整的 iisreset。
为了解决这个问题,我一直在做一些研究,似乎可能有3种不同的方法,CodeDom,RunSharp/Relfection.Emit,Roslyn。
据我所知,反思。Emit/Runsharp 将允许我创建类并在运行时向它们添加属性和属性,并且可能在需要时修改它们而不会产生不利影响。
我不确定 Roslyn 是否允许这样做,我无法找到任何创建包含属性或属性的类的简单示例,并且我看到一些提到 Roslyn 的输出是不可变的,所以我不确定如何允许我在以后修改它而不会产生不利影响。
总的来说,从我所看到的情况来看,大多数人不推荐 CodeDom,所以我不完全确定我是否应该费心走这条路。
谁能告诉我这些方向中的哪些对我来说是可行的?
因此,这些解决方案都不起作用,老实说,在运行时生成类型真的不是您想要的。
对于 CLR,一旦您拥有了包含字段和方法的类型,就无法真正在运行时添加新成员或更改成员。我们最接近的是Visual Studio中的编辑和继续功能,我们高度限制我们可以进行的更改。我们经常"作弊",不添加您认为添加的方法或属性,但我们将它们隐藏在其他地方,并在您进行编辑时发出引用此机密位置的 IL。完全不支持删除成员之类的疯狂事情。即使它得到了支持,许多代码也喜欢假设执行someObject.GetType().GetMembers()
一遍又一遍地返回相同的内容。
就 Roslyn 而言,当我们说结果是"不可变的"时,我们并不是说这会对可能用它生成的任何 IL 提出任何要求。相反,当您要求 Roslyn 解析某些内容或分析源代码时,对象(语法树、类型信息等)是不可变的。不过,这并不重要,因为一旦存在 CLR 中的类型,就无法对其进行修改。
我同意svick在他的评论中 - 这不是你想做的。 使用一些适当的数据结构在运行时表示您的信息,而不是试图将其视为可以以某种方式改变的具体类。