-1

注: .NETパッドコードはこちら

ジェネリック型パラメーターを受け取る基本クラスがあります。

ベースを形成する各クラスには、これのみで構成される対応するコレクションクラスがあります。

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

それだけです:それはList<T>コンテナだけです。

ただし、メソッドの1つがこのコレクションを返すことであるため、基本クラスで問題が発生しています。

次の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

これはコンパイルされます:

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

他のリストが機能しない理由はわかりませんが、C# 言語内で行われるチェックと関係があると思います。

于 2013-02-13T20:53:21.210 に答える
1

がありDAL_Base<T>、ネストされたタイプがあります: Dal_Base<T>+TList、これは: List<T>です。それは問題ありませんが、それはa とはBuyerListの関係もないので、この 2 つは互換性が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 に答える