我不确定这是否是Covariance和Contravariance问题,但我不能让这个工作.这是代码:
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 { },}; 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方法.知道如何解决这个问题?
解决方法
是的,这是一个差异问题.您需要创建一个接口(只有接口和委托可以是共同/逆变)IPaginatedDto< out TDto> Dtos不能有一个setter(否则你不能用完):
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... }