自动映射对象的数组

时间:2017-08-01 22:56:29

标签: c# automapper

我正在尝试映射包含源类的object数组,这些源类必须映射到包含目标类的object数组。但它确实可以为我的代码开箱即用。

class Class1ChildClass
{
    public int Value { get; set; }
}

class Class1
{
    // This array contains classes of type Class1ChildClass
    public object[] ClassesAsObjects { get; set; }
}

class Class2ChildClass
{
    public int Value { get; set; }
}

class Class2
{
    // This array should contain classes of type Class2ChildClass
    public object[] ClassesAsObjects { get; set; }
}

心灵的直接思路就是这段代码:

var cl1 = new Class1
{
    ClassesAsObjects = 
        new object[] {
            new Class1ChildClass
            {
                Value = 999
            }
        }
};

var config = 
    new MapperConfiguration(
        cfg =>
        {
            cfg.CreateMap<Class1ChildClass, Class2ChildClass>();
            cfg.CreateMap<Class1, Class2>();
        }
    );
var mapper = config.CreateMapper();
var cl2 = mapper.Map<Class2>(cl1);

无论我做什么,我总是在目的地课程Class1ChildClass中获得Class2数组。

我尝试使用ForMember但没有成功。

2 个答案:

答案 0 :(得分:0)

根据这个:https://github.com/AutoMapper/AutoMapper/wiki/Lists-and-arrays

  

AutoMapper仍然需要对子映射进行显式配置,因为AutoMapper无法“猜测”要使用的特定子目标映射。

所以你可能需要添加这样的东西:

Mapper.Initialize(c=> {
    c.CreateMap<Class1, Class2>()
         .Include<Class1ChildClass, Class2ChildClass>();
    c.CreateMap<Class1, Class2>();
});

答案 1 :(得分:0)

我不知道你为什么要在这种情况下使用Automapper,而不是仅仅手动进行映射。根据我的理解,Automapper会查看类型及其属性,并与之相提并论。

但是在您的情况下,利用Automapper并不多。您使用的object没有Value属性。您想映射object[]的成员,但实际上希望内容以某种方式从一个(对象子类)转换为另一个(

)。

但是如果你想使用Automapper,你可以使用AfterMap来映射ClassesAsObjects成员:

var config = 
    new MapperConfiguration(
        cfg =>
        {
            cfg.CreateMap<Class1, Class2>()
                .AfterMap((src, dest) =>
                {
                    dest.ClassesAsObjects = src.ClassesAsObjects
                        .Select(x => 
                        {
                            return (x is Class1ChildClass)
                                ? (object)(new Class2ChildClass { Value = (x as Class1ChildClass).Value }) 
                                : null;
                        }).ToArray();

                });
        }
    );