Я столкнулся с проблемой similair и хотел бы добавить к ответу Джона Скитса, что есть другой вариант. Причина, по которой я узнал, заключалась в том, что я понял, что многие методы расширения в Asp MVC3 используют анонимные классы в качестве входных данных для предоставления атрибутов html (new {alt = "Image alt", style = "padding-top: 5px"} =>
В любом случае - эти функции используют конструктор класса RouteValueDictionary. Я попробовал это сам, и, конечно же, это работает - хотя только на первом уровне (я использовал многоуровневую структуру). ТАК - в коде это будет:
object o = new {
name = "theName",
props = new {
p1 = "prop1",
p2 = "prop2"
}
}
SeparateAssembly.TextFunc(o)
//In SeparateAssembly:
public void TextFunc(Object o) {
var rvd = new RouteValueDictionary(o);
//Does not work:
Console.WriteLine(o.name);
Console.WriteLine(o.props.p1);
//DOES work!
Console.WriteLine(rvd["name"]);
//Does not work
Console.WriteLine(rvd["props"].p1);
Console.WriteLine(rvd["props"]["p1"]);
ТАК ... Что здесь на самом деле происходит? Взгляд внутрь RouteValueDictionary показывает этот код (значения ~ = o выше):
foreach (PropertyDescriptor descriptor in TypeDescriptor.GetProperties(values))
object obj2 = descriptor.GetValue(values);
//"this.Add" would of course need to be adapted
this.Add(descriptor.Name, obj2);
}
ТАК - используя TypeDescriptor.GetProperties (o), мы сможем получить свойства и значения, несмотря на то, что анонимный тип создается как внутренний в отдельной сборке! И, конечно, это было бы довольно легко расширить, чтобы сделать его рекурсивным. И сделать метод расширения, если вы хотите.
Надеюсь, это поможет!
/ Victor