无法隐式将 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方法。知道我该怎么解决这个问题吗?

是的,这是一个差异问题。您需要创建一个接口(只有接口和委托可以是协同/反向的)IPaginatedDto<out TDto>,其中Dtos不能有setter(否则您不能使用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...
}

相关内容

  • 没有找到相关文章

最新更新