这就是我所做的(我强调这只能真正充分解决匿名类型的问题);将成员提出并推入ExpandoObject
.
我最初的改变是使投影成为返回一个的多语句ExpandoObject
:
ViewBag.SomeData = Enumerable.Range(1,10).Select(i=> {
var toReturn = new ExpandoObject();
toReturn.Value = i;
return toReturn;
});
它几乎和匿名类型一样短,只是不那么干净。
但后来我想知道是否可以从匿名类型中获取公共可读的成员(类型是内部的,但它生成的属性是公共的):
public static class SO7429957
{
public static dynamic ToSafeDynamic(this object obj)
{
//would be nice to restrict to anonymous types - but alas no.
IDictionary<string, object> toReturn = new ExpandoObject();
foreach (var prop in obj.GetType().GetProperties(
BindingFlags.Public | BindingFlags.Instance)
.Where(p => p.CanRead)) // watch out for types with indexers
{
toReturn[prop.Name] = prop.GetValue(obj, null);
}
return toReturn;
}
}
这意味着我可以使用我的原始代码 - 但在末尾标记了一些扩展方法调用:
ViewBag.SomeData=Enumerable.Range(1,10).Select(i=> new { Value = i }.ToSafeDynamic());
It's not高效,而且绝对应该not用于严肃的生产代码。但这是一个很好的节省时间的方法。