将具有引用属性的类映射到使用该引用属性类型作为基类的类
本文关键字:引用 属性 类型 基类 映射 | 更新日期: 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.Name
和CountryDto.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));