1

私はこのようIPagedListに実装するインターフェースを持っていますIList

public interface IPagedList<T> : IList<T>
{
    int PageCount { get; }
    int TotalItemCount { get; }
    int PageIndex { get; }
    ...
}

IPagedListこれを使用して、ページネーションでデータを表現したいと思います。IListを使用していた既存のコードを変換しようとしていますIPagedList

public IList<MyViewModel> Data
{
  get
  {         
    List<MyViewModel> myVal = new List<MyViewModel>();
    foreach (MyModel m in data)
    {
       myVal.Add(new MyViewModel(m));
    }
    return myVal;
  }
}

では、なぜこれを変換できないのか疑問に思っています

public IPagedList<MyViewModel> Data
{
   get
    .... 

IPagedList実装の原因IListと、これを修正するにはどうすればよいですか。

4

3 に答える 3

8

IPagedList<T>を実装IList<T>し、List<T>また実装しますIList<T>、それは正しいです。

List<T>しかし、それはaをに変換できるという意味ではありませんIPagedList<T>。それはまだ2つの異なるタイプです。考えてみてください。ポルシェは車であり、プジョーは車ですが、それでも交換はできません。

インターフェイスの具体的な実装が必要ですIPagedList<T>。持っている場合は、次のコードを使用できます。

public IList<MyViewModel> Data 
{ 
    get 
    { 
        var myVal = new PagedList<MyViewModel>(); 
        foreach (MyModel m in data) 
        { 
            myVal.Add(new MyViewModel(m)); 
        } 
        return myVal; 
    } 
} 
于 2012-09-06T11:42:43.873 に答える
5

だから、なぜこれを変換できないのか疑問に思いますpublic IPagedList Data { get

List<T>インターフェイスが実装されていないため、使用できなくなります。を実装する独自のクラスを作成しましたIPagedList<T>

より重要な質問はData、ページリストを返すプロパティがあることです。ページングをどのように処理する必要があるかは明らかではありません。

最初は、リストを列挙するときに各ページを遅延ロードすることです。しかし、そうではありませんか?あなたはあなたのデザインを再考したいかもしれません。

代わりに、compositionを使用して新しいインターフェイスを作成します。

interface IPagedResult<T>
{
    int PageCount { get; }
    int TotalItemCount { get; }
    int PageIndex { get; }
    IEnumerable<T> Page {get; }
}

単一のページが返されることはより明白であり、独自のリストクラスを作成する必要はありません。

于 2012-09-06T11:42:31.507 に答える
0

その理由は、myVal がインターフェイス IPageList ではなく IList から実装されたリストを返すためです。

于 2012-09-06T11:44:35.387 に答える