从泛型类型加载的通用集合

时间:2009-05-12 08:46:46

标签: c# generics collections

我有以下代码,我试图为我的DAL中的对象创建一个通用集合(只是一个练习,而不是实际的生产代码)。我的问题是我想使用传入Read方法的类型(它是类实现的接口的一部分)。

我无法创建new T所以我没有要使用的对象的实例,并且我不能将它声明为基类型,因为我需要基础对象的子项指定的read方法。

这实际上是可能还是我在错误的树上咆哮?

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 个答案:

答案 0 :(得分:3)

你能否在集合所持有的类型上有一个默认构造函数,并将new()指令添加到where T:指令?

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

然后: -

    T item = new T();

答案 1 :(得分:1)

我不清楚为什么你不能使用new T()(对T有适当的约束)。我还不清楚为什么你使用显式接口实现,以及为什么你的ILoadable接口有一个名为ILoadable的方法,请注意。

问题是你不能总是保证在对象类型中有一个无参数构造函数吗?如果是这种情况,您肯定需要某些来创建T的实例。也许您实际上需要将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>构造函数中。