注意: .NET Pad代码HERE。
我有一个带有泛型类型参数的基类。
它将构成基础的每个类都有一个相应的 Collection Class ,它只包含这个:
public class List_SomeType : List<SomeTime> {
public List_SomeType() {
}
}
就是这样:它只有一个List<T>容器。
但是,它在我的基类中造成了问题,因为其中一种方法是返回此集合。
我尝试创建以下获取方法,这对我来说非常有意义:
public TList Get() {
var list = new TList();
using (var cmd = new SqlCommand(SP_GET, m_openConn)) {
cmd.CommandType = CommandType.StoredProcedure;
using (var r = cmd.ExecuteReader()) {
while (r.Read()) {
list.Add(FillDataRecord(r));
}
}
cmd.Connection.Close();
}
return list;
}
public class TList : List<T> {
public TList() { }
}
在我的派生类中,我计划按如下方式调用此基类:
public class BuyerDB : DAL_Base<Buyer> {
private static BuyerDB one;
static BuyerDB() {
one = new BuyerDB();
}
public static BuyerList GetBuyerList() {
return (BuyerList)one.Get(); // <= ERROR HERE!
}
}
此处的错误声明:
无法将'DAL_Base.TList'类型转换为'BuyerList'
如何转换回我的通用类型的集合?
马克想知道BuyerList
是什么。
我认为从我写的内容中可以理解。
显然不是,所以这里是:
public class BuyerList : List<Buyer> { }
这就是全部!
答案 0 :(得分:1)
您有一个DAL_Base<T>
,并且有一个嵌套类型:Dal_Base<T>+TList
,即: List<T>
。这没关系,但这与BuyerList
没有任何关系,因此两者不兼容,只有B
和C
兼容(他们不是)这里:
class A {}
class B : A {}
class C : A {} // cannot assign a B to a C or a C to a B
我建议您完全忘记Dal_Base<T>+TList
和BuyerList
,并使用List<T>
/ List<Buyer>
:
public List<T> Get() {
var list = new List<T>;
using (var cmd = new SqlCommand(SP_GET, m_openConn)) {
cmd.CommandType = CommandType.StoredProcedure;
using (var r = cmd.ExecuteReader()) {
while (r.Read()) {
list.Add(FillDataRecord(r));
}
}
cmd.Connection.Close();
}
return list;
}
....
public static List<Buyer> GetBuyerList() {
return one.Get();
}
我还建议你看看“小巧玲珑”,或许只是使用:
public List<T> Get() {
return m_openConn.Query<T>(SP_GET, commandType: CommandType.StoredProcedure)
.ToList();
}
虽然实际上很少需要“获取所有没有过滤器的行”方法。
答案 1 :(得分:1)
编译:
public static BuyerList getBuyerList() {
var result = new BuyerList();
result.AddRange(one.Get());
return result;
}
我不确定为什么其他列表不起作用,但我猜它与C#语言内部的检查有关。