Dzięki komentarzu Patryk Dałem mu szansę przy użyciu ExpandoObject, ale to działa tak:
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);
Ta ostatnia linia była kluczem do coraz to pracę w MVC tak, że może być przekazywana jako parametr additionalViewData w edytorzeDla itp.
W sytuacjach, w których otrzymuję anonimową klasę i muszę sam ją dodać, używam odbicia (i korzystam z implementacji IDael). Oto test jednostka pisałem aby sprawdzić, czy to działa:
[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");
}
Tak, albo to, albo skorzystać z '' dynamic' ExpandoObject' zamiast :) –
@ PatrykĆwiek Tak, to prawda. Bardzo lubię ExpandoObject tbh, jest całkiem fajnie. –
Nie rozumiem, dlaczego nie trzymałeś 'obiektu' w kodzie? Oba typy anonimowe to "obiekt". –