可以混合对象初始化器和集合初始化器吗?

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'),希望新名称能更好地反映新的含义.