0

実装したいデータ機能の基本クラスとして機能するいくつかのクラスを作成する必要があります。

最初に、SessionObjectDataItem を次のように呼び出します...

public class ObjectSessionDataItem
{
  public int ID { get; set; }

  public bool IsDirty { get; set; }

  public bool IsNew { get; set; }

  public bool IsRemoved { get; set; }
}

次に、ObjectSessionDataList という名前のリストが必要ですが、ここで行き詰まります。

クラスを作成できます...

public class SessionObjectDataList<SessionObjectDataItem> : List<SessionObjectDataItem>
{

}

私が陥る場所は、リスト内の項目にアクセスするリストのプロパティを定義しようとすることです。例えば、書きたい...

public List<SessionObjectDataItem> DirtyItems
{
    get
    {
        return this.Where(d => d.IsDirty).ToList();
    }
}

しかし、VS は List オブジェクト定義内の SessionObjectDataItem プロパティ IsDirty を認識することを拒否します。

私が終わろうとしているのは、私が定義するかもしれないケースです

public class AssociatedDocument : SessionObjectDataItem
{
    ...
}

public class DocumentList : SessionObjectDataList
{

}

そして、言えるように...

DocumentList list = new DocumentList();
...
foreach(AssociatedDocument doc in list.DirtyItems)
{
    ...
}

私が試みていることを実際に行うことはできますか?私はそれを間違っているだけですか?

4

2 に答える 2

2

ここでは一般的な制約が役立ちます。ジェネリック型パラメーターが、SessionObjectDataItemまたはそのサブタイプの 1 つに制約されているコンテナー クラスを作成できます。これにより、 の特定のサブタイプのインスタンスを保持できるジェネリック クラスを構築SessionObjectDataItemできます。

public class SessionObjectDataList<T> : List<T> where T : SessionObjectDataItem
{
    public SessionObjectDataList<T> DirtyItems
    {
       get
       {
           return this.Where(d => d.IsDirty).ToList();
       }
    }
}

使用法:

var list = new SessionObjectDataList<AssociatedDocument>();
...

foreach(AssociatedDocument doc in list.DirtyItems)
{
    ...
}
于 2010-10-17T13:47:21.263 に答える
1

Where<T>クエリ可能なインターフェイスの汎用バージョンを使用してみてください。

public List<SessionObjectDataItem> DirtyItems
{
    get
    {
        return this.AsQueryAble().Where<SessionObjectDataItem>(d => d.IsDirty).ToList();
    }
}

それ以外Whereの場合は、単に d を Object 型と見なします。

于 2010-10-17T13:45:51.483 に答える