Инициализация объекта аналогична синтаксису List <> - PullRequest
3 голосов
/ 26 декабря 2011

Как я могу определить класс так, чтобы он мог быть инициализирован аналогично List<T>:

List<int> list = new List<int>(){ //this part };

например, этот сценарий:

Class aClass = new Class(){ new Student(), new Student()//... };

Ответы [ 3 ]

6 голосов
/ 26 декабря 2011

Обычно, чтобы разрешить синтаксис collection-initializer непосредственно для 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 Инициализаторы коллекций» спецификации языка .

1 голос
/ 26 декабря 2011

Если вы определите 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()//... }}

То, что вы выберете, действительно зависит от того, как вы моделируете класс.

0 голосов
/ 26 декабря 2011

Я не видел никого, кто предлагал бы реализацию дженериков, так что вот оно.

    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};
...