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

从泛型类型加载泛型集合

  •  1
  • Pondidum  · 技术社区  · 17 年前

    new T

    public class ItemDictionary<T> where T : ILoadable, DataItem
    {
    
        public void Load()
        {
            using (IDataReader reader = SqlHelper.ExecuteReader(_connection, CommandType.StoredProcedure, _proc)) {
                Read(reader);
            }
        }
    
        bool Read(IDataReader reader)
        {
            while (reader.Read) 
            {
                T item = default(T);            //Here be the problem
    
                if (item.Read(reader)) 
                {
                    this.Add(item.Guid, item);
                }
            }
    
            return true;
        }
    
    }
    
    public class ExampleObject : DataItem, ILoadable
    {
    
        bool Read(IDataReader reader)
        {
            _var1 = reader.getString(0);
            _var2 = reader.getString(1);
            _var3 = reader.getString(2);
    
            return true;
        }
    }
    
    2 回复  |  直到 17 年前
        1
  •  3
  •   AnthonyWJones    17 年前

    public class ItemDictionary<T> where T : ILoadable, DataItem, new()
    

    然后:-

        T item = new T();
    
        2
  •  1
  •   Jon Skeet    17 年前

    你不能用 new T() T ILoadable I可加载 请注意。

    问题是你不能总是保证对象类型中有一个无参数构造函数吗?如果是这样的话,你肯定需要 创建以下实例 T 从它的工厂,也许还有另一个接口:

    public interface IFactory<T>
    {
        // Roughly matching your current API
        bool TryRead(IDataReader reader, out T);
    
        // Simpler if you can just throw an exception on error
        T Read(IDataReader reader);
    }
    

    IFactory<T> 实施到您的 ItemDictionary<T>