将带有引用 属性 的 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.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。实现此目的的正确自动映射器配置是什么?
你可以简单地这样做:
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>();
让我们从一些简单的例子开始 类。
这是我的来源 类,请注意 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。实现此目的的正确自动映射器配置是什么?
你可以简单地这样做:
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>();