Создание нового класса с инициализаторами коллекции в C#
У меня есть класс, который я создал. Я хотел бы позволить классу иметь инициализатор коллекции. Вот пример класса:
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"}
}
Можно ли это сделать с классами, которые не являются словарями и списками?
3 ответа
В дополнение к Add
метод, класс должен также реализовать IEnumerable
интерфейс.
См. Также: Инициализаторы объектов и коллекций (Руководство по программированию в C#)
Да, как указано в других ответах (просто, чтобы дать более подробную информацию), просто реализовать 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();
}
}
Да, это возможно. На самом деле, вы почти решили это сами. Требования для использования инициализатора коллекции, как это, является 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();
}
}