4

我有一个我创建的课程。我想让这个类能够有一个集合初始化器。这是该类的示例:


public class Cat
{
    private Dictionary catNameAndType = new Dictionary();

    public Cat()
    {

    }

    public void Add(string catName, string catType)
    {
        catNameAndType.Add(catName,catType);
    }

}

我希望能够在课堂上做这样的事情:


Cat cat = new Cat()
{
    {"Paul","Black"},
    {"Simon,"Red"}
}

这可能与不是字典和列表的类有关吗?

4

3 回答 3

12

除了Add方法之外,类还必须实现IEnumerable接口。

另请参阅:对象和集合初始化器(C# 编程指南)

于 2011-10-25T20:41:50.157 回答
1

对的,这是可能的。实际上,您几乎自己解决了它。使用这样的集合初始化程序的要求是一种Add采用两种方法(您有)的方法,并且该类型实现了 IEnumerable (您缺少)。所以让你的代码工作;使用类似的东西:

public class Cat : IEnumerable<KeyValuePair<string,string>>
{
    private Dictionary<string,string> catNameAndType = new Dictionary<string,string>();

    public Cat()
    {

    }

    public void Add(string catName, string catType)
    {
        catNameAndType.Add(catName,catType);
    }

    public IEnumerator<KeyValuePair<string,string>> GetEnumerator() 
    {
        return catNameAndType.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator() 
    {
        return GetEnumerator();
    }
}
于 2011-10-25T20:45:10.153 回答
1

是的,正如其他答案中所述(只是为了提供更多细节),只需实现IEnumerable<T>并拥有一些Add()方法:

// inherit from IEnumerable<whatever>
public class Cat : IEnumerable<KeyValuePair<string,string>>
{
    private Dictionary<string, string> catNameAndType = new Dictionary<string, string>();

    public Cat()
    {

    }

    // have your Add() method(s)
    public void Add(string catName, string catType)
    {
        catNameAndType.Add(catName, catType);
    }

    // generally just return an enumerator to your collection
    public IEnumerator<KeyValuePair<string, string>> GetEnumerator()
    {
        return catNameAndType.GetEnumerator();
    }

    // the non-generic form just calls the generic form
    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}
于 2011-10-25T20:46:52.413 回答