-1

注意: .NET Pad 代码在这里

我有一个接受泛型类型参数的基类。

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

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

就是这样:它只是一个List<T>容器。

但是,它在我的基类中造成了问题,因为其中一种方法是返回此集合。

我尝试创建以下Get方法,这对我来说非常有意义:

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> { }

就这样!

4

2 回答 2

1

你有一个DAL_Base<T>, 并且有一个嵌套类型: Dal_Base<T>+TList, 即: List<T>. 没关系,但这与 a没有任何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>+TListand 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();
}

我还建议您看一下“dapper”,也许只是使用:

 public List<T> Get() {
     return m_openConn.Query<T>(SP_GET, commandType: CommandType.StoredProcedure)
                      .ToList();
}

尽管在现实中,“获取所有行而不使用过滤器”的方法很少是可取的。

于 2013-02-13T20:28:31.987 回答
1

这编译:

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

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

于 2013-02-13T20:53:21.210 回答