【问题标题】:Generic collection loading from the generic type从泛型类型加载泛型集合
【发布时间】:2009-05-12 08:46:45
【问题描述】:

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

我无法创建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;
    }
}

【问题讨论】:

    标签: c# generics collections


    【解决方案1】:

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

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

    然后:-

        T item = new T();
    

    【讨论】:

    • 这正是我所缺少的!它甚至可以在 VB.net 中使用 :)
    【解决方案2】:

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

    问题是你不能总是保证对象类型中有无参数的构造函数吗?如果是这种情况,您肯定需要something 来创建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&lt;T&gt; 实现传递给您的 ItemDictionary&lt;T&gt; 构造函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-11
      • 2018-03-03
      • 2017-12-24
      • 2021-12-04
      • 1970-01-01
      • 2011-04-16
      相关资源
      最近更新 更多