2

我有一种情况,我想在运行时使用他们的 EditorFor/DisplayFor 模板(或类似的东西)构建 MVC 样式视图。

理想情况下,我们的应用程序会让用户在他们的 UI 中选择他们想要的字段(这样他们就可以添加/删除他们认为合适的任何字段),为此我认为在运行时创建视图模型类并添加各种根据用户选择的内容(即字符串长度、必需等)赋予它们的 dataannotation 属性。

我需要能够支持的一件事是在运行时更改生成的类而不影响其他用户或不必执行完整的 iisreset。

为此,我一直在做一些研究,似乎可能有 3 种不同的方法,CodeDom、RunSharp / Relfection.Emit、Roslyn。

据我所知,reflection.Emit/Runsharp 将允许我创建类并在运行时向它们添加属性和属性,并且可能还可以在需要时修改它们而不会产生不利影响。

我不确定 Roslyn 是否允许这样做,我无法找到任何创建具有属性或属性的类的简单示例,而且我看到一些提到 Roslyn 的输出是不可变的,所以我我不确定这如何让我在以后修改它而不会产生不利影响。

一般来说,我所看到的大多数人都不推荐 CodeDom,所以我不完全确定我是否应该费心走这条路。

谁能告诉我这些方向中的哪一个对我来说是可行的?

4

1 回答 1

1

所以,这些解决方案都不起作用,老实说,在运行时生成类型真的不是你想要的。

对于 CLR,一旦你有了一个包含字段和方法的类型,你就不能真正在运行时添加新成员或更改成员。我们最接近做到这一点的是 Visual Studio 中的编辑和继续功能,我们高度限制了我们可以进行的更改。我们经常通过不添加您认为添加的方法或属性来“作弊”,但我们将它们隐藏在其他地方并在您进行编辑时发出引用此秘密位置的 IL。完全不支持删除成员等疯狂的事情。即使它支持,很多代码喜欢假设做someObject.GetType().GetMembers()一遍又一遍地返回相同的东西。

就 Roslyn 而言,当我们说结果是“不可变的”时,我们并不是说对您可能使用它生成的任何 IL 提出任何要求。相反,当您要求 Roslyn 解析某些内容或分析源代码时,对象(语法树、类型信息等)是不可变的。不过,这并不重要,因为一旦 CLR 中的类型存在,您就无法对其进行修改。

我在他的评论中支持 svick——这不是你想要做的。在运行时使用一些适当的数据结构来表示您的信息,而不是试图将其视为可以以某种方式变异的具体类。

于 2013-10-16T01:51:35.113 回答