如何创建通用类型集合?

时间:2013-02-13 20:14:27

标签: c# generics

注意: .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> { }

这就是全部!

2 个答案:

答案 0 :(得分:1)

您有一个DAL_Base<T>,并且有一个嵌套类型:Dal_Base<T>+TList,即: List<T>。这没关系,但这与BuyerList没有任何关系,因此两者不兼容,只有BC兼容(他们不是)这里:

class A {}
class B : A {}
class C : A {} // cannot assign a B to a C or a C to a B

我建议您完全忘记Dal_Base<T>+TListBuyerList,并使用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#语言内部的检查有关。