jsm*_*ars 14 c# ienumerable initialization
我按照此处的说明使用IEnumerable定义了一个集合初始化程序:http: //msdn.microsoft.com/en-us/library/bb384062.aspx
现在,我可以在我的集合初始化程序中创建对象,并使用我的Add()方法添加它们,如下所示:
class ArrangedPanel : RectElement
{
private List<RectElement> arrangedChildren = new List<RectElement>();
public int Padding = 2;
public void Add(RectElement element)
{
arrangedChildren.Add(element);
//do custom stuff here
}
public IEnumerator GetEnumerator()
{
return arrangedChildren.GetEnumerator();
}
}
// Somewhere
debugPanel.Add(new ArrangedPanel()
{
new ButtonToggle(),
new ButtonToggle()
});
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试设置属性,例如我的"填充"字段,我会在集合初始值设定项上出错.
debugPanel.Add(new ArrangedPanel()
{
Padding = 5,
new ButtonToggle(),
new ButtonToggle()
});
Run Code Online (Sandbox Code Playgroud)
是否可以设置集合初始化器和对象初始化器?
Iri*_*ium 12
遗憾的是,无法混合对象和集合初始值设定项.C#3.0规范将7.5.10.1节中的对象创建表达式定义为:
object-creation-expression:
new type ( argument-listopt ) object-or-collection-initializeropt
new type object-or-collection-initializer
正如您所料,object-or-collection-initializer是对象初始值设定项还是集合初始值设定项.没有可用于组合的语法.
Hay*_*ach 10
我遇到了类似的问题.最接近的一个可以明显得到的,就是在类中添加一个允许集合初始化程序访问的属性:
在ArrangedPanel:
public ArrangedPanel Container {
get { return this; }
}
Run Code Online (Sandbox Code Playgroud)
在代码中:
debugPanel.Add(new ArrangedPanel()
{
Padding = 5,
Container = {
new ButtonToggle(),
new ButtonToggle()
}
});
Run Code Online (Sandbox Code Playgroud)
还不错,我猜?
@Edit:根据@Tseng的评论,我更改了新属性的返回值,以返回ArrangedObject自身而不是其List<RectElement>成员.这样就ArrangedPanel.Add可以调用该方法,并重用其中任何(可能更复杂的)逻辑.
@ Edit2:重命名属性('Children' - >'Container'),希望新名称能更好地反映新的含义.