C# массивоподобный конструктор для собственного класса - PullRequest
1 голос
/ 14 марта 2020

Я хочу создать пользовательский класс, который можно инициализировать так же, как массивы,

var myCollection = new MyCollection<string> {"a", "b", "c"}

Существует ли синтаксис для создания класса, который может это интерпретировать?

Я знаю, как сделать то же самое со свойствами класса, например

var person = new Person { Name = "Santi", LastName = "Arizti" };

Но это не то, что я ищу.

Возможно, этот вопрос уже существует, но я просто не знаю его имени этой функции для эффективного поиска в Интернете.

Ответы [ 2 ]

4 голосов
/ 14 марта 2020

Ваш класс должен

  1. Реализация IEnumerable
  2. Иметь метод Add

Вот и все.

public class MyCollection<T> : IEnumerable<T>
{
    protected readonly List<T> _list = new List<T>();

    public void Add(T item) 
    {
        _list.Add(item);
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return _list.GetEnumerator();
    }

    public IEnumerator<T> GetEnumerator()
    {
        return _list.GetEnumerator();
    }
}

public class Program
{
    public static void Main()
    {
        var x = new MyCollection<string>
        {
            "A","B"
        };
    }
}

Вот ссылка на скрипку

3 голосов
/ 14 марта 2020

Конструирование объекта с использованием {...} просто создает его с помощью конструктора по умолчанию и вызывает для каждого из аргументов метод Add , присутствующий в нем (или набор аргументов, если используется вложенный {...}). Нужно только реализовать IEnumerable .

Ваш пример по существу эквивалентен:

var myCollection = new MyCollection<string>();
myCollection.Add("a");
myCollection.Add("b");
myCollection.Add("c");

Вот самый простой пример такого класса, который можно "инициализировать" с помощью что-нибудь:

public class TestClass : IEnumerable
{
    public void Add<T>(params T[] args)
    {

    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        throw new NotImplementedException();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...