2

EditorFor/DisplayFor テンプレート (または類似のもの) を使用して、実行時に MVC スタイル ビューを構築したい状況があります。

理想的には、私たちのアプリケーションでは、UI に必要なフィールドをユーザーが選択できるようにする (したがって、必要に応じて任意のフィールドを追加/削除できます)。この目的のために、実行時にビューモデル クラスを作成し、さまざまなdataannotation は、ユーザーが選択したもの (つまり、文字列の長さ、必須など) に従ってそれらに属性を付けます。

私がサポートできるようにする必要があることの 1 つは、他のユーザーに影響を与えたり、完全な iisreset を実行したりすることなく、実行時に生成されたクラスを変更することです。

これを行うために、私は少し調査を行ってきましたが、CodeDom、RunSharp / Relfection.Emit、Roslyn の 3 つの異なるアプローチがあるようです。

私が言えることから、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 に答える