自动映射:映射匿名/动态类型

时间:2017-03-09 16:54:08

标签: c#-4.0 automapper-5

我需要一些帮助才能使用Automapper映射匿名对象。目标是将Product和Unity结合在ProductDto中(统一是产品的属性)。

Autommaper CreateMissingTypeMaps配置设置为true

我的课程:

public class Product 
{
    public int Id { get; set; }
}

public class Unity 
{
    public int Id { get; set; }
}

public class ProductDto 
{
    public int Id { get; set; }
    public UnityDto Unity{ get; set; }
}

public class UnityDto
{
    public int Id { get; set; }
}

测试代码

Product p = new Product() { Id = 1 };
Unity u = new Unity() { Id = 999 };
var a = new { Product = p, Unity = u };

var t1 = Mapper.Map<ProductDto>(a.Product); 
var t2 = Mapper.Map<UnityDto>(a.Unity);
var t3 = Mapper.Map<ProductDto>(a); 

Console.WriteLine(string.Format("ProductId: {0}", t1.Id)); // Print 1
Console.WriteLine(string.Format("UnityId: {0}", t2.Id)); // Print 999
Console.WriteLine(string.Format("Anonymous ProductId: {0}", t3.Id)); // Print 0 <<< ERROR: It should be 1 >>>
Console.WriteLine(string.Format("Anonymous UnityId: {0}", t3.Unity.Id)); // Print 999

配置文件中添加了两个mapp:

CreateMap<Product, ProductDto>();
CreateMap<Unity, UnityDto>();

1 个答案:

答案 0 :(得分:1)

问题是Automapper如何映射匿名对象。我没有时间查看Automapper源代码,但是我的匿名对象发生了微小的更改,我得到了所需的行为:

var a = new { Id = p.Id, Unity = u };

通过这样做,我甚至可以删除以前的映射,因为它现在只使用CreateMissingTypeMaps

注意:事实上,我不确定这是不是真的是一个问题,或者这只是我不切实际的期望。