C# 如何创建泛型类型的集合?

C# 如何创建泛型类型的集合?,c#,generics,C#,Generics,注意:.NET Pad代码 我有一个基类,它接受泛型类型参数 它将构成其基础的每个类都有一个相应的集合类,该集合类仅包含以下内容: public class List_SomeType : List<SomeTime> { public List_SomeType() { } } 就这些 您有一个DAL_Base,它有一个嵌套类型:DAL_Base+TList,即:List。这很好,但这与BuyerList没有任何关系,因此这两者不兼容,正如B和C在这里不兼容一样: 我建议

注意:.NET Pad代码

我有一个基类,它接受泛型类型参数

它将构成其基础的每个类都有一个相应的集合类,该集合类仅包含以下内容:

public class List_SomeType : List<SomeTime> {
  public List_SomeType() {
  }
}
就这些

您有一个
DAL_Base
,它有一个嵌套类型:
DAL_Base+TList
,即
:List
。这很好,但这与
BuyerList
没有任何关系,因此这两者不兼容,正如
B
C
在这里不兼容一样:

我建议您完全忘记
Dal_Base+TList
BuyerList
,只使用
列表
/
列表

公共列表Get(){
var列表=新列表;
使用(var cmd=new SqlCommand(SP_GET,m_openConn)){
cmd.CommandType=CommandType.storedProcess;
使用(var r=cmd.ExecuteReader()){
while(r.Read()){
添加(FillDataRecord(r));
}
}
cmd.Connection.Close();
}
退货清单;
}
....
公共静态列表GetBuyerList(){
返回一个。Get();
}
我还建议您看看“dapper”,也许只是使用:

 public List<T> Get() {
     return m_openConn.Query<T>(SP_GET, commandType: CommandType.StoredProcedure)
                      .ToList();
}
公共列表Get(){
返回m_openConn.Query(SP_GET,commandType:commandType.storedProcess)
.ToList();
}
尽管在现实中,“无过滤器获取所有行”方法很少可取。

这编译:

public static BuyerList getBuyerList() {
  var result = new BuyerList();
  result.AddRange(one.Get());
  return result;
}

我不确定为什么另一个列表不起作用,但我猜它与C语言内部的检查有关。

BuyerList在哪里声明?为什么不只列出?为什么
TList
/
BuyerList
存在?您上面的示例要么缺少一些必要的代码,要么您对代码块之间的一致性很开放…
BuyerList
,如上所述,就是
公共类BuyerList:List{}
。我没有意识到我需要明确地表明这一点,但我可以。等等…@MarcGravel:编辑有帮助吗?@jp2code:添加了一个答案不幸的是,这个项目已经使用
BuyerList
设计,因此将所有类转换为使用
List
会阻止大量代码。至于移动
DAL_Base+TList
,我已经注意到了,并且已经将
TList
移动到
DAL_Base
之外,但我仍然无法转换。我添加了一个链接到此。你不能编译它,但是所有的代码都在那里…如果有帮助的话@jp2code在这种情况下,您有两个选择:1:将DAL更改为双泛型,并接受实体类型之外的列表类型,或2:使用从
one.get
返回的任何对象填充
new BuyerList
,即
BuyerList GetBuyerList(){var fromDal=one.get();var list=new BuyerList();foreach(fromDal中的var obj)list.Add(obj);return list;
Ah。基本上我写的是我自己的答案。不过直到现在才把你的评论发布给我。
public class BuyerList : List<Buyer> { }
class A {}
class B : A {}
class C : A {} // cannot assign a B to a C or a C to a B
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();
}
public static BuyerList getBuyerList() {
  var result = new BuyerList();
  result.AddRange(one.Get());
  return result;
}