Patryk からのコメントのおかげで、ExpandoObject を使用して試してみたところ、次のように機能しました。
dynamic viewData = new ExpandoObject();
viewData.@class = cssClasses;
if (controlId != null)
viewData.id = controlId;
if (title != null)
viewData.title = title;
// put the result into a route value dictionary so that MVC's EditorFor (etc) can interpret it
var additionalViewData = new RouteValueDictionary(viewData);
その最後の行は、EditorFor などで additionalViewData パラメーターとして渡すことができるように、MVC で動作させるための鍵でした。
匿名クラスが渡され、自分で追加する必要がある状況では、リフレクションを使用しています (そして、IDictionary を実装する ExpandoObject を利用しています)。これが機能することを確認するために書いた単体テストです。
[TestMethod]
public void ShouldBeAbleToConvertAnAnonymousObjectToAnExpandoObject()
{
var additionalViewData = new {id = "myControlId", css = "hide well"};
dynamic result = new ExpandoObject();
var dict = (IDictionary<string, object>)result;
foreach (PropertyInfo propertyInfo in additionalViewData.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public))
{
dict[propertyInfo.Name] = propertyInfo.GetValue(additionalViewData, null);
}
Assert.AreEqual(result.id, "myControlId");
Assert.AreEqual(result.css, "hide well");
}