将带有引用 属性 的 class 映射到使用该引用 属性 类型作为基础 class 的 class

Mapping a class with a reference property to a class that uses that reference property type as a base class

让我们从一些简单的例子开始 类。

这是我的来源 类,请注意 CountryDto 包含 CurrencyDto 引用类型 属性:

public class CountryDto
{
    public string Name { get; set; }
    public CurrencyDto Currency { get; set; }
}

public class CurrencyDto
{
    public string Name { get; set; }
    public string Code { get; set; }
}

这里和我的目的地 类,注意 CountryVm 继承了 CurrencyVm:

public class CountryVm : CurrencyVm
{
    public string Name { get; set; }
}

public class CurrencyVm
{
    public string Code { get; set; }
}

所以假设我有一个 CountryDto,我希望将它映射到 CountryVm。我的简单英语映射是 CountryDto.Name -> CountryVm.NameCountryDto.Currency.Code -> CountryVm.Code

问题是,假设我通常调用:

CountryVm myCountryVm = Mapper.Map<CountryDto, CountryVm>(myCountryDto);

我目前正在尝试这个:

Mapper.CreateMap<CountryDto, CountryVm>()
    .IncludeBase<CurrencyDto, CurrencyVm>();

Mapper.CreateMap<CurrencyDto, CurrencyVm>()
    .ForMember(dest => dest.Code, opt => opt.MapFrom(src => src.Currency.Code));

但我收到一条错误消息,指出它需要一种 CurrencyDto,但它是 CountryDto。实现此目的的正确自动映射器配置是什么?

你可以简单地这样做:

Mapper.CreateMap<CountryDto, CountryVm>()
    .ForMember(dst => dst.Name, opt => opt.MapFrom(src => src.Name))
    .ForMember(dst => dst.Code, opt => opt.MapFrom(src => src.Currency.Code));

您收到错误的原因是 AutoMapper 期望 IncludeBase<,> 方法的源和目标类型参数与 CreateMap<,> 方法的类型参数兼容,但是在你的情况 CountryDto 类型与 CurrencyDto.

完全无关

如果您的 类 真的像这个例子一样简单,那么 Yacoub 的回答显示了创建映射的最简单方法,但是如果您想避免为每个派生类型重复映射,您可以这样做:

首先映射目标基类型(CurrencyVm)的属性:

Mapper.CreateMap<CountryDto, CurrencyVm>()
    .ForMember(dest => dest.Code, opt => opt.MapFrom(src => src.Currency.Code));

然后映射目标派生类型 (CountryVm) 的属性,并包含我们在上述步骤中添加的基类型的映射:

Mapper.CreateMap<CountryDto, CountryVm>()
    .ForMember(dest => dest.Name, opt => opt.MapFrom(src => src.Name))
    .IncludeBase<CountryDto, CurrencyVm>();