2012-08-26 61 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<PersonDto>PaginatedDto<IDto>ProcessDto方法。任何想法如何解決這個問題?

回答

6

是的,這是一個方差問題。您需要創建一個接口(僅限接口和委託可以共同/逆變)IPaginatedDto<out TDto>其中Dtos不能有一個二傳手(否則你無法使用out):

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>會實現這個接口:

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

相關問題