【发布时间】:2011-06-15 21:36:49
【问题描述】:
我试图在 c# 中使用 DynamicObject,我需要一个动态数组:
var d = new dynamic[];
效果很好。
编辑:参见下面的 ExpandoObject。
但我也喜欢用这种压缩的初始化新语法用一些数据填充该数组:
var d = new dynamic[] {
new {
Name = "Some",
Number = 1010
},
new {
Name = "Other",
Number = 2010
}
}
但在这种情况下,所有对象都会获得非动态类型“对象”,并且通过项目循环会给我一个例外:
foreach (dynamic item in d)
{
@item.Name
@item.Number
}
错误:“对象”不包含“名称”的定义。我想我只是以错误的方式初始化数组项。如何改为添加动态对象?
编辑:新内容:
我意识到“动态”没有动态添加属性的能力。
我最好使用 ExpandoObject,它将内部字典中的所有项目作为属性公开。但不幸的是 ExpandoObject 似乎不支持这种漂亮的压缩创建语法,编译器抱怨:
var d = new ExpandoObject[]{
new ExpandoObject(){
Name="Nnn",
Number=1080
}
}
所以答案可能只是:不可能。
【问题讨论】:
-
你确定你不只是想要一个匿名类型的数组吗?
-
这是在 ASP.NET MVC3 中吗?
-
请记住,
dynamic是object,只是 C# 编译器对它的处理方式不同,并将dynamic上的所有访问权限转移到 DLR -
foreach 正在使用 Razor 是的。和匿名类型 - 是的,如果它有效,我会在那里得到同样的错误 - 那是当我尝试动态时:)
-
@joeriks:您是否尝试过对数组的每个元素进行显式强制转换?这有点讨厌,但它可能会起作用。
标签: c# dynamic object-initializers