让我们从一些简单的示例类开始。
以下是我的源类,请注意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
问题是,假设我调用通常的内容,我的automapper配置应该是什么样的呢?
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。实现这一目标的正确的automaticpper配置是什么?
答案 0 :(得分:2)
您遇到错误的原因是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>();
答案 1 :(得分:0)
你可以这样做:
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));