ここで動的型を使用することで、どのような利点を得たいと考えていましたか?
ViewData ディクショナリを使用すると、ビュー出力に任意のオブジェクト/アイテムを簡単に追加できます。
ビュー内のプロパティ名を取得するためにリフレクションは必要ありません。ViewData.Keys
名前のコレクションを取得するために使用するだけです。
編集:私は自分自身でダイナミクスについてもう少し学びました。おそらく、DynamicObjectから継承する独自の動的オブジェクト クラスを作成する必要があると思います。そのクラスにプライベート ディクショナリを用意してから、 and をオーバーライドする必要がTrySetMember
ありTryGetMember
ます。
編集はさておき:強く型付けされた ViewModel の利点の 1 つは、POST Action メソッドのパラメーターとして受け入れることができることだと思います。MVC フレームワークはモデル バインディングを処理し、アクション メソッドには ViewModel クラスのインスタンスを設定するだけです。たとえ機能したとしても、ダイナミックでその利点があるとは思いません。
編集結果: DynamicObject から派生したクラスを使用してみましたが、ビューをレンダリングしようとすると VS2010 がクラッシュします。例外は発生しません。ハード クラッシュと Visual Studio の再起動だけです。これが、クラッシュの原因となる私が思いついたコードです。
カスタム動的クラス:
public class DynViewModel : DynamicObject
{
private Dictionary<string, object> ViewDataBag;
public DynViewModel()
{
this.ViewDataBag = new Dictionary<string, object>();
}
public override bool TrySetMember(SetMemberBinder binder, object value)
{
this.ViewDataBag[binder.Name] = value;
return true;
}
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
result = this.ViewDataBag[binder.Name];
return true;
}
}
コントローラーで:
public ActionResult DynamicView()
{
dynamic p = new DynamicViewModel.Models.DynViewModel();
p.Name = "Test";
p.Phone = "111-2222";
return View(p);
}
私の見解は、基本的に質問に記載されているものと同じです。
<p>Name: <%=Model.Name %></p>
<p>Phone: <%=Model.Phone %></p>
私の結論:これはうまくいくかもしれませんが、VS2010 の Beta 1 では、私のコードが原因で Visual Studio がクラッシュする理由がわかりません。VS2010 Beta 2 がリリースされたら、ダイナミクスを学ぶ上で興味深い演習になるので、もう一度試してみます。ただし、これが機能したとしても、ViewData ディクショナリを使用する利点はまだありません。
フィル・ハークが助けに!これは、Phil Haack によるブログ投稿です。それはあなたが探していたもののようです。メソッド Missing と C# 4 の楽しみ方