Благодаря комментарий от Patryk я дал ему идти, используя ExpandoObject и получило это работает так:
dynamic viewData = new ExpandoObject();
[email protected] = 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);
Это последняя строка была ключ к получению его работой в MVC, так что он может быть принят как параметр дополнительногоViewData в EditorFor и т. д.
В ситуациях, когда мне передают анонимный класс и нужно добавить его сам, я использую отражение (и используя ExpandoObject, реализующий IDictionary). Вот тестовый модуль я написал, чтобы проверить, что это работает:
[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");
}
Да, или это, или использовать '' dynamic' с ExpandoObject' вместо :) –
@ PatrykĆwiek Да, верно. Мне очень нравится ExpandoObject tbh, это довольно круто. –
Я не понимаю, почему вы не сохранили «объект» в коде? Оба анонимных типа, о которых идет речь, являются «объектами». –