Инициализация объекта аналогична синтаксису List<>
Как я могу определить класс, чтобы он мог быть инициализирован так же, как List<T>
:
List<int> list = new List<int>(){ //this part };
Например, этот сценарий:
Class aClass = new Class(){ new Student(), new Student()//... };
3 ответа
Как правило, чтобы разрешить синтаксис инициализатора коллекции непосредственно на Class
, он будет реализовывать интерфейс коллекции, такой как ICollection<Student>
или аналогичный (скажем, наследуя от Collection<Student>
).
Но с технической точки зрения, это нужно только для реализации неуниверсального IEnumerable
интерфейс и иметь совместимый Add
метод.
Так что это было бы достаточно хорошо:
using System.Collections;
public class Class : IEnumerable
{
// This method needn't implement any collection-interface method.
public void Add(Student student) { ... }
IEnumerator IEnumerable.GetEnumerator() { ... }
}
Использование:
Class aClass = new Class { new Student(), new Student() };
Как и следовало ожидать, код, сгенерированный компилятором, будет похож на:
Class temp = new Class();
temp.Add(new Student());
temp.Add(new Student());
Class aClass = temp;
Для получения дополнительной информации см. Раздел "7.6.10.3 Инициализаторы коллекций" спецификации языка.
Если вы определите MyClass
как коллекция студентов:
public class MyClass : List<Student>
{
}
var aClass = new MyClass{ new Student(), new Student()//... }
Кроме того, если ваш класс содержит общедоступную коллекцию Student
:
public class MyClass
{
public List<Student> Students { get; set;}
}
var aClass = new MyClass{ Students = new List<Student>
{ new Student(), new Student()//... }}
Какой из них вы выберете, действительно зависит от того, как вы моделируете класс.
Я не видел никого, кто предлагал бы реализацию дженериков, так что вот оно.
class Class<T> : IEnumerable
{
private List<T> list;
public Class()
{
list = new List<T>();
}
public void Add(T d)
{
list.Add(d);
}
public IEnumerator GetEnumerator()
{
return list.GetEnumerator();
}
}
и использовать:
Class<int> s = new Class<int>() {1,2,3,4};