AutoMapper包含自定义List <t> </t>的所有属性

时间:2013-10-26 06:02:18

标签: c# automapper automapper-2 automapper-3

class SomeObject
{
   public string name {get;set;}
}

class CustomCollection : List<SomeObject>
{
   public int x {get;set;}
   public string z {get;set;}
}

class A
{
   public CustomCollection collection { get ; set; }
}

class B
{
   public CustomCollection collection { get ; set; }
}


// Creating mapping   
Mapper.CreateMap<A, B>();

当我将A映射到B时,除了CustomCollection中的X和Z之外,所有属性都被正确映射。

CustomCollection正确获取已初始化的SomeObject列表,并且还正确映射了SomeObject.Name。

只有我在集合中声明的自定义属性X,Z才会被映射。

我做错了什么?

我发现的唯一方法就是像下面那样进行后映射,但是它有点挫败了使用automapper的目的,每当我向CustomCollection添加一个新属性时它就会中断。

 Mapper.CreateMap<A, B>().AfterMap((source, destination) => { 
     source.x = destination.x; 
     source.z = destination.z ;
});

1 个答案:

答案 0 :(得分:0)

您当前的映射配置确实会创建一个新的CustomCollection,但里面的SomeObject项是对源集合中对象的引用。如果这不是问题,您可以使用以下映射配置:

CreateMap<CustomCollection, CustomCollection>()
    .AfterMap((source, dest) => dest.AddRange(source));

CreateMap<A, B>();

如果b.collection引用a.collection你也可以,你可以使用以下映射配置:

CreateMap<CustomCollection, CustomCollection>()
    .ConstructUsing(col => col);

CreateMap<A, B>();

AutoMapper不是为克隆而设计的,所以如果你需要,你必须为此编写自己的逻辑。