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

时间:2015-12-15 22:36:49

标签: c# automapper

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

以下是我的源类,请注意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

问题是,假设我调用通常的内容,我的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配置是什么?

2 个答案:

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