2012-08-26 5 views
6

これは共分散およびコントラバナンスの問題ではあるがわかりませんが、私はこの問題を解決できません。ここでは、コードは次のとおりです。MyType <Foo>をMyTypeに暗黙的に変換できません<IFoo>

public interface IDto { } 

public class PaginatedDto<TDto> where TDto : IDto { 

    public int PageIndex { get; set; } 
    public int PageSize { get; set; } 
    public int TotalCount { get; set; } 
    public int TotalPageCount { get; set; } 

    public bool HasNextPage { get; set; } 
    public bool HasPreviousPage { get; set; } 

    public IEnumerable<TDto> Dtos { get; set; } 
} 

public class PersonDto : IDto { 

    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Surname { get; set; } 
    public int Age { get; set; } 
} 

class Program { 

    static void Main(string[] args) { 

     var people = new List<PersonDto> { 
      new PersonDto { }, 
      new PersonDto { }, 
      new PersonDto { }, 
     }; 

     var paginatedPersonDto = new PaginatedDto<PersonDto>() { 
      Dtos = people 
     }; 

     //ProcessDto doesn't accept this 
     ProcessDto(paginatedPersonDto); 
    } 

    private static void ProcessDto(PaginatedDto<IDto> paginatedDto) { 

     //Do work... 
    } 
} 

何らかの理由で、私はPaginatedDto<IDto>ProcessDtoの方法としてPaginatedDto<PersonDto>を渡すことはできません。どのようなアイデアを私はこの問題を解決することができますか?

答えて

6

はいこれは分散の問題です。

public interface IPaginatedDto<out TDto> where TDto : IDto 
{ 
    int PageIndex { get; set; } 
    int PageSize { get; set; } 
    int TotalCount { get; set; } 
    int TotalPageCount { get; set; } 
    bool HasNextPage { get; set; } 
    bool HasPreviousPage { get; set; } 
    IEnumerable<TDto> Dtos { get; } 
} 

をそして、あなたのPaginatedDto<TDto>は、このインタフェースを実装します:あなたはDtosはセッターを持つことができないインタフェース(インタフェースのみとデリゲートが共同することができます/反変)IPaginatedDto<out TDto>を作成する必要があります(そうしないとoutを使用することはできません)

public class PaginatedDto<TDto> : IPaginatedDto<TDto> where TDto : IDto 
{ 

    public int PageIndex { get; set; } 
    public int PageSize { get; set; } 
    public int TotalCount { get; set; } 
    public int TotalPageCount { get; set; } 

    public bool HasNextPage { get; set; } 
    public bool HasPreviousPage { get; set; } 

    public IEnumerable<TDto> Dtos { get; set; } 
} 

そして、あなたの方法でインターフェースを使用します。

private static void ProcessDto(IPaginatedDto<IDto> paginatedDto) 
{ 

    //Do work... 
} 
+0

ああ、私の愚かな頭を!私は実際にそれを試みましたが、メソッドを 'ProcessDto(PaginatedDto paginatedDto)'のように残し、期待通りに動作しませんでした。 – tugberk

関連する問題