我不确定这是否是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...
- }