【问题标题】:map to derived type of destination in AutoMapper在 AutoMapper 中映射到派生类型的目的地
【发布时间】:2014-02-12 12:04:53
【问题描述】:

我想指定一个映射,以便从“Source”到“Destination”的所有映射都作为“Destination”的派生类返回

    [Test]
    public void Map_SourceToDestinationAsDerivedType_ReturnsDerivedType()
    {
        // arrange
        AutoMapper.Mapper.CreateMap<Source, Destination>()
            .CreateAs<ActualDestination>() // psedu code
            .ForMember(dst => dst.Transformed, opt => opt.ResolveUsing(src => src.Property));

        var source = new Source{Property = "hi mom" };

        // act
        var destination = AutoMapper.Mapper.Map<Destination>(source);

        // assert
        Assert.That(destination, Is.InstanceOf<ActualDestination>());
    }

    public class Source
    {
        public string Property { get; set; }
    }

    public class Destination
    {

    }

    public class ActualDestination : Destination
    {
        public string Transformed { get; set; }            
    }

【问题讨论】:

  • 为什么不为派生类型 Mapper.CreateMap&lt;Source, ActualDestination&gt;() 创建一个映射并在映射中使用它:AutoMapper.Mapper.Map&lt;ActualDestination&gt;(source);
  • 如果是这样的话,你真的认为我会问一个问题吗?
  • Automapper 不支持这一点,最接近你能得到的就是写这样的东西:AutoMapper.Mapper.CreateMap&lt;Source, ActualDestination&gt;() .ForMember(dst =&gt; dst.Transformed, opt =&gt; opt.ResolveUsing(src =&gt; src.Property)); AutoMapper.Mapper.CreateMap&lt;Source, Destination&gt;() .ConstructUsing((Source s) =&gt; AutoMapper.Mapper.Map&lt;ActualDestination&gt;(s));
  • 谢谢,把它写下来作为答案,我会接受的
  • 好吧,好吧,但我不明白你为什么不写AutoMapper.Mapper.Map&lt;ActualDestination&gt;(source);?即使使用我的“解决方案”,您仍然只能将每个 Source 实例映射到 ActualDestination 那么为什么要在映射中使用派生类型?

标签: automapper


【解决方案1】:

Automapper 不直接支持此功能

但是,您可以获得的最接近的方法是为 Source, ActualDestination 对定义映射器

AutoMapper.Mapper.CreateMap<Source, ActualDestination>() 
    .ForMember(dst => dst.Transformed, opt => opt.ResolveUsing(src => src.Property)); 

然后使用Source, Destination 映射中的ConstructUsing 选项将Source 转换为ActualDestination

AutoMapper.Mapper.CreateMap<Source, Destination>()
    .ConstructUsing((Source s) => AutoMapper.Mapper.Map<ActualDestination>(s));

【讨论】:

  • 旁注:在 ForMember 中,您应该使用 MapFrom 而不是 ResolveUsing .ForMember(dst =&gt; dst.Transformed, opt =&gt; opt.MapFrom(src =&gt; src.Property));
猜你喜欢
  • 1970-01-01
  • 2019-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-04
相关资源
最近更新 更多