【问题标题】:How to use AutoMapper to map objects by order defined in the class?如何使用 AutoMapper 按类中定义的顺序映射对象?
【发布时间】:2016-06-15 09:51:27
【问题描述】:

鉴于这两个对象(我使用非常不同的对象来更好地澄清):

public class Car
{
   public string Brand {get;set;}
   public int Speed {get;set;}
}

public class Apple
{
   public string Variety {get;set;}
   public int Production {get;set;}
}

AutoMapper 定义了projection,它允许映射具有不同名称的属性:

var config = new MapperConfiguration(cfg =>
        {
            cfg.CreateMap<Car, Apple>()
                 .ForMember(dest => dest.Variety, opt => opt.MapFrom( src => src.Brand))
                 .ForMember(dest => dest.Production, opt => opt.MapFrom(src => src.Speed))
        });

这应该可以,但是:

有没有什么方法可以直接按照类中定义的顺序来映射属性?:

Brand -> Variety
Speed -> Production

我正在使用 AutoMapper 4.2.1

【问题讨论】:

    标签: c# .net mapping automapper


    【解决方案1】:

    没有。您描述的“顺序”只是它们在 C# 源代码中的表达方式。请记住,.NET 编译为中间语言 (IL),然后由 .NET 运行时执行。无法保证您在 C# 中键入字段的顺序与编译到 IL 时发出的顺序相同。

    【讨论】:

      【解决方案2】:

      有没有办法按照类中定义的顺序直接映射属性?

      不可以,但您可以显式设置映射顺序,以便某些成员在其他成员之前映射。这允许您为一个属性提供自定义映射,该映射可能依赖于您需要已经映射的另一个目标属性。

              CreateMap<SourceType, DestType>()
                  .ForMember(
                      dst => dst.Property1,
                      opt.SetMappingOrder(0))
                  .ForMember(
                      dst => dst.Property2,
                      opts =>
                      {
                          opts.SetMappingOrder(20);
                          opts.ResolveUsing<ResolverThatNeedsProperty1ToBeMappedAlready>();
                      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-01-06
        • 1970-01-01
        • 2015-10-20
        • 1970-01-01
        • 1970-01-01
        • 2016-05-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多