代码之家  ›  专栏  ›  技术社区  ›  MedicineMan

如何为自定义映射类实现具有内联初始化的构造函数?

  •  9
  • MedicineMan  · 技术社区  · 15 年前

    我有一个场景,其中我有一个自定义映射类。

    我希望能够创建新实例并同时为其声明数据,并实现类似以下的语法:

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

    等等。如何定义类以启用这种语法?

    2 回复  |  直到 15 年前
        1
  •  7
  •   Jeff Cyr    15 年前

    你想表达的是 Collection Initializer

    您的HybridDictionary类需要实现IEnumerable,并具有如下的Add方法:

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

    那么你的声明就可以了。

    注意:按照惯例,键应该是第一个参数,后跟值(即void add(字符串键、人员值)。

        2
  •  4
  •   driis    15 年前

    基本上,您应该实现ICollection<t>,但这里有一个更详细的解释: http://blogs.msdn.com/madst/archive/2006/10/10/What-is-a-collection_3F00_.aspx .

    在本文中,MadsTorgersen解释了使用基于模式的方法,因此唯一的要求是需要有一个具有正确参数的公共添加方法并实现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();
        }
    }