我使用自动调制器来调平来自WS的对象。简化模型如下:
public abstract class AOrder {
public Product Product {get;set;}
public decimal Amount {get;set;}
//number of other properties
}
public abstract class Product {
//product properties
}
public class RatedProduct : Product {
public int Rate { get;set;}
}
public class MarketOrder : AOrder {
//some specific market order properties
}
使用automapper,我试图将其平铺成:
public class OrderEntity {
public decimal Amount {get;set;}
public int ProductRate {get;set;}
}
与下一个映射:
CreateMap<RatedProduct, OrderEntity>();
CreateMap<MarketOrder, OrderEntity>();
上面的映射不能映射ProductRate。我刚刚使用了AfterMap:
CreateMap<MarketOrder, OrderEntity>()
.AfterMap((s,d) => {
var prod = s.Product as RatedProduct;
if (prod != null)
{
//map fields
}
});
工作得很好,但我想如果我能重用自动器的平坦化可能性(即按名称匹配),我就不需要在很多地方应用after映射了。
注意:我不能改变WS,这只是对象层次结构的一小部分。
建议感激。
将Rate映射到ProductRate使用" member "
相当直接你必须对特定类型进行强制转换以查看它是否是该类型,这有点棘手,但我认为你采取的相同方法是你可能必须做的,但我认为你不需要做"aftermap"。我认为你所有的目标映射必须被找到,否则你需要将它们标记为忽略映射将失败。
您可以做的另一件事就是更改OrderEntity。ProductRate为OrderEntity.Rate。然后它会找到它并为您映射它,除了它被隐藏的地方,因为Product没有速率(但RatedProducts有)。
public class OrderEntity {
public decimal Amount {get;set;}
public int Rate {get;set;} //changed name from ProductRate to just Rate.
}
Mapper.CreateMap<Product, OrderEntity>()
.Include<RatedProduct, OrderEntry>();
Mapper.CreateMap<RatedProduct, OrderEntry>();
参见:集合中的多态元素类型