Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从泛型类型加载泛型集合_C#_Generics_Collections - Fatal编程技术网

C# 从泛型类型加载泛型集合

C# 从泛型类型加载泛型集合,c#,generics,collections,C#,Generics,Collections,我有以下代码,其中我尝试为DAL中的对象创建一个通用集合(只是一个练习,而不是实际的生产代码)。我的问题是我想使用传入的类型的Read方法(它是类实现的接口的一部分) 我无法创建新T,因此我没有要处理的对象实例,也无法将其声明为基类型,因为我需要基对象的子对象指定的读取方法 这真的可能吗?还是我找错了方向 public class ItemDictionary<T> where T : ILoadable, DataItem { public void Load()

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

我无法创建
新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;
    }
}
公共类ItemDictionary,其中T:ILoadable,DataItem
{
公共空荷载()
{
使用(IDataReader reader=SqlHelper.ExecuteReader(_connection,CommandType.storedProcess,_proc)){
阅读(读者);
}
}
bool Read(IDataReader阅读器)
{
while(reader.Read)
{
T item=default(T);//问题出在这里
如果(项目读取(读卡器))
{
添加(item.Guid,item);
}
}
返回true;
}
}
公共类ExampleObject:DataItem,ILoadable
{
bool Read(IDataReader阅读器)
{
_var1=reader.getString(0);
_var2=reader.getString(1);
_var3=reader.getString(2);
返回true;
}
}

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

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

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

public class ItemDictionary<T> where T : ILoadable, DataItem, new()
我不清楚为什么不能使用
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
{
//与当前API大致匹配
bool-TryRead(IDataReader阅读器,输出T);
//如果您可以在出错时抛出异常,则更简单
T读(IDataReader读卡器);
}
然后您可以将一个
IFactory
实现传递到
ItemDictionary
构造函数中。

我不清楚为什么不能使用
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
{
//与当前API大致匹配
bool-TryRead(IDataReader阅读器,输出T);
//如果您可以在出错时抛出异常,则更简单
T读(IDataReader读卡器);
}

然后您可以将一个
IFactory
实现传递到
ItemDictionary
构造函数中。

这正是我缺少的!它甚至在VB.net中工作:)这正是我所缺少的!它甚至可以在VB.net中运行:)