我有以下代码,我试图为我的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;
}
}
答案 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>
构造函数中。