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

本文关键字:引用 属性 类型 基类 映射 | 更新日期: 2023-09-27 18:26:53

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

以下是我的源类,请注意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。要实现这一点,正确的自动映射器配置是什么?

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

出现错误的原因是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>();

您可以简单地这样做:

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));