C# Automapper如何在2个泛型类型之间映射自定义接口

C# Automapper如何在2个泛型类型之间映射自定义接口,c#,asp.net-core,automapper,C#,Asp.net Core,Automapper,我有一个界面: public interface IQueryResult<T> where T : IBaseEntity { PageInfo PageInfo { get; } IEnumerable<T> Payload { get; } } 公共接口IQueryResult,其中T:IBaseEntity { PageInfo PageInfo{get;} IEnumerable有效负载{get;} } 实施: public cla

我有一个界面:

public interface IQueryResult<T> where T : IBaseEntity
{
    PageInfo PageInfo { get; }
    IEnumerable<T> Payload { get; }     
}
公共接口IQueryResult,其中T:IBaseEntity
{
PageInfo PageInfo{get;}
IEnumerable有效负载{get;}
}
实施:

public class QueryResult<T> : IQueryResult<T> where T : IBaseEntity
{
    public QueryResult()
    {

    }
    public QueryResult(IEnumerable<T> payload, PageInfo pageInfo)
    {
        Payload = payload;
        PageInfo = pageInfo;
    }
    public QueryResult(IEnumerable<T> payload)
    {
        Payload = payload;
    }
    public IEnumerable<T> Payload { get; private set; }
    public PageInfo PageInfo { get; private set; }
}
公共类QueryResult:IQueryResult其中T:IBaseEntity
{
公共查询结果()
{
}
公共查询结果(IEnumerable有效负载,PageInfo PageInfo)
{
有效载荷=有效载荷;
PageInfo=PageInfo;
}
公共查询结果(IEnumerable payload)
{
有效载荷=有效载荷;
}
公共IEnumerable有效负载{get;private set;}
公共页面信息页面信息{get;private set;}
}
映射器配置:

    CreateMap<EntityA, DtoA>();
    CreateMap<DtoA, EntityA>();

    CreateMap<EntityB, DtoB>();
    CreateMap<DtoB, EntityB>();

    CreateMap(typeof(IQueryResult<>), typeof(IQueryResult<>));
CreateMap();
CreateMap();
CreateMap();
CreateMap();
CreateMap(typeof(iqeryResult),typeof(iqeryResult));
然后我想在控制器中执行此操作:

IQueryResult<EntityA> entities = service.GetAll();
IQueryResult<DtoA> result = _mapper.Map<IQueryResult<DtoA>>(entities);
IQueryResult entities=service.GetAll();
IQueryResult=\u mapper.Map(实体);
目前,它没有中断,但问题是,由于属性具有私有setter,因此目标的属性为null


我需要一种方法来告诉它如何映射属性或使用构造函数我想我让它工作了如果有人遇到这个问题,我将把它留在这里:

在研究Automapper文档后,我发现了以下解决方案:

您可以定义
ITypeConverter

public class QueryResultConverter<TSource, TDest>
: ITypeConverter<IQueryResult<TSource>, IQueryResult<TDest>> where TSource: IBaseEntity where TDest : IBaseEntity
{
    public IQueryResult<TDest> Convert(IQueryResult<TSource> source, IQueryResult<TDest> destination, ResolutionContext context)
    {
        List <TDest> payload = context.Mapper.Map<List<TDest>>(source.Payload);
        destination = new QueryResult<TDest>(payload, source.PageInfo);

        return destination;
    }
}
公共类QueryResultConverter
:ITypeConverter其中TSource:IBaseEntity其中tTest:IBaseEntity
{
公共IQueryResult转换(IQueryResult源、IQueryResult目标、ResolutionContext上下文)
{
List payload=context.Mapper.Map(source.payload);
destination=newqueryresult(有效负载,source.PageInfo);
返回目的地;
}
}
然后,您可以配置映射以使用转换器:

CreateMap(typeof(IQueryResult<>), typeof(IQueryResult<>)).ConvertUsing(typeof(QueryResultConverter<,>));
CreateMap(typeof(IQueryResult),typeof(IQueryResult)).ConvertUsing(typeof(QueryResultConverter));