如何为我编写的类编写数组样式的初始化器?

时间:2014-07-07 01:00:56

标签: c# arrays constructor indexing

在C#中,您可以初始化数组和其他对象,例如Lists,甚至是Dictionaries,如下所示:

Type[] array = new Type[] { new Type(), new Type(), new Type()...};

或更奇怪的是,字典:

Dictionary<string, object> dictionary = new Dictionary<string, object> () {
    { "key1", value },
    { "key2", value }
};

我如何为自己的对象类型编写构造函数?就我而言,我想将它用于我命名为LayerGroup的对象:

LayerGroup layers = new LayerGroup() {
    "background",
    "foreground",
    "menu",
    "entities"
};

我也想知道如何用词典风格来做这件事:

LayerGroup layers = new LayerGroup() {
    { 4, "background" },
    { 1, "foreground" },
    { 0, "menu" },
    { 3, "entities" }
};

(在这种情况下,我当然会为LayerGroup类提供不同的结构,这只是一个例子)

2 个答案:

答案 0 :(得分:5)

要获取集合初始值设定项,您需要实现2个方法并从IEnumerable继承您的类:

public class LayerGroup: IEnumerable
{
    private readonly IList<string> _collection = new List<string>();

    public void Add(string value)
    {
        _collection.Add(value);
    }

    public IEnumerator GetEnumerator()
    {
        return _collection.GetEnumerator();
    }
}

同样,如果你想得到“类似于字典”的初始化,你需要实现

public void Add(string key, string value)
{
  ...
}

或整个IDictionary界面,如果您想获得全部字典功能。

答案 1 :(得分:3)

数组样式初始值设定项称为 Collection Initializers 。为了使集合初始值设定器起作用,正在初始化的对象需要实现IEnumerable,并提供相应的Add方法,其签名与您计划提供的参数相匹配。

因此LayerGroup类需要包含Add方法,如下所示:

public void Add(string name);

这将允许您使用类似列表的初始化程序初始化LayerGroup。如果你提供像这样的Add方法

public void Add(int number, string name);

您可以使用类似字典的初始化程序(即您问题中的最后一个代码段)。