我正在尝试映射包含源类的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
但没有成功。
答案 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();
});
}
);