2013-10-15 33 views
1

我有一种情况,我想在运行时使用EditorFor/DisplayFor模板(或类似的东西)构建MVC样式视图。在运行时编写和更改代码

理想情况下,我们的应用程序可以让用户在他们的UI中选择他们想要的字段(所以他们可以添加/删除任何他们认为合适的),为此我认为在运行时创建viewmodel classess并根据用户选择的内容(即stringlength,required等)为其添加各种dataannotation属性。

有一件事我需要能够支持在运行时不会影响其他用户或有做了充分的IISRESET正在改变已经生成的类。

去这个问题我已经做了一些研究,它看起来可能有3点不同的方法,CodeDom中,RunSharp/Relfection.Emit,罗斯林。

从我可以告诉Reflection.Emit的/ Runsharp,让我创建的类和在运行时添加attibutes和属性,对他们也可能对其进行修改,当我需要无不良影响。

我不确定Roslyn是否会允许这样做,我还没有能够追踪任何创建一个具有属性或属性的类的简单示例,我已经看到一些提到Roslyn的输出是不可变的,所以我不知道这是如何让我在以后修改它没有不利影响。

一般从什么我见过的大多数人不推荐的CodeDOM所以我不能完全肯定我是否应该去打扰这条路线。

任何人都可以给我一个这些方向中的哪一个可能适合我的想法吗?

+0

你确定你确实需要在运行时创建一个类型吗?不会像'Dictionary '足够吗? – svick

回答

1

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

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

至于罗斯林而言,当我们说的结果是“不可改变的”,我们的意思不是说穿上,你可能与它产生任何IL任何要求。相反,当您要求Roslyn解析某些东西或分析源代码时,对象(语法树,类型信息等)是不可变的。不过,这并不重要,因为一旦CLR存在就不能修改CLR中的类型。

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

+0

intersesting,是的,因为我一直在做更多的研究,它开始考虑这个,如果我们没有要求用户能够在运行时改变类型,那么我只是在代码中有我自己的预建类,所以我的想法是尽可能地通过动态创建整个类来尝试和重现,然后我可以利用诸如模板对象的MVC反射,以及使用RavenDB存储它们而不需要太多修改 –

+0

如果您需要动态的东西,只需在你的类型中使用Dictionary ,不必担心传统意义上的类型安全。 –

+0

是的我认为我正在与一个具有键(字符串)属性和值属性(对象)的类,主要是由于MVC中字典绑定的一些问题,我意识到我并不在乎什么类型只要我能用这种方法通过反思就可以告诉它 –

相关问题