Как я могу реализовать конструктора со встроенной инициализацией для пользовательского класса сопоставления?

У меня есть сценарий, где у меня есть пользовательский класс отображения.

Я хотел бы иметь возможность создать новый экземпляр и объявить данные для него одновременно и реализовать синтаксис, подобный:

    public static HybridDictionary Names = new HybridDictionary()        
    { 
        {People.Dave, "Dave H."},
        {People.Wendy, "Wendy R."}
    }

и так далее. Как я определяю свой класс для включения этого вида синтаксиса?

9
задан MedicineMan 7 January 2010 в 18:58
поделиться

2 ответа

Вы пытаетесь получить Инициализатор коллекции

Ваш класс HybridDictionary должен реализовать IEnumerable<> и иметь метод Add вида:

public void Add(People p, string name)
{
    ....
}

Тогда ваше инстанцирование должно работать.

Примечание: По соглашению, ключ должен быть первым параметром, за которым должно следовать значение (т.е. void Add(string key, People value).

7
ответ дан 4 December 2019 в 20:24
поделиться

В принципе, необходимо реализовать ICollection, но вот более подробное объяснение: http://blogs.msdn.com/madst/archive/2006/10/10/What-is-a-collection_3F00_.aspx.

В статье Мэдс Торгерсен объясняет, что используется шаблонный подход, поэтому единственным требованием является наличие публичного метода Add с правильными параметрами и реализация IEnumerable. Другими словами, этот код действителен и работает:

using System.Collections;
using System.Collections.Generic;

class Test
{
    static void Main()
    {
        var dictionary = new HybridDictionary<string, string>
                                 {
                                     {"key", "value"}, 
                                     {"key2", "value2"}
                                 };
    }
}

public class HybridDictionary<TKey, TValue> : IEnumerable<KeyValuePair<TKey, TValue>>
{
    private readonly Dictionary<TKey, TValue> inner = new Dictionary<TKey, TValue>();
    public void Add(TKey key, TValue value)
    {
        inner.Add(key, value);
    }

    public IEnumerator<KeyValuePair<TKey, TValue>> GetEnumerator()
    {
        return inner.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}
4
ответ дан 4 December 2019 в 20:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: