鉴于以下情况:
var object1 = new A() { Equipment = new List<FooEquipment>() { new FooEquipment() } };
var object2 = new B() { Equipment = new List<FooEquipment>() { new FooEquipment() } );
var list = new List<Foo>() { object1, object2 };
(我继承了一些遗留代码,List应该在A和B的基类中)。
有了一些新类,
public class AFooEquipment : FooEquipment
{
}
public class BFooEquipment : FooEquipment
{
}
我可以使用 AutoMapper 来转换这些 FooEquipments
进入AFooEquipment
和 BFooEquipment
通过某种方式检查他们的父项目? IE。在映射器中,我会看到 object1 在 typeof(A) 类中,所以我转换它的设备 -> List<AFooEquipment>
.它会看到 object2 在 typeof(B) 类中,所以我转换它的设备 -> List<BFooEquipment>
.
这可能吗?
最佳答案
我使用的是 AutoMapper 3,所以这可能不适合你,但一种选择是使用 ResolutionContext
和 ConstructUsing
方法,像这样:
CreateMap<Foo, Foo>()
.Include<A, Foo>()
.Include<B, Foo>();
CreateMap<A, A>();
CreateMap<B, B>();
CreateMap<FooEquipment, FooEquipment>()
.ConstructUsing((ResolutionContext ctx) =>
{
if (ctx.Parent != null) // Parent will point to the Equipment property
{
var fooParent = ctx.Parent.Parent; // Will point to Foo, either A or B.
if (fooParent != null)
{
if (fooParent.SourceType == typeof(A)) return new AFooEquipment();
if (fooParent.SourceType == typeof(B)) return new BFooEquipment();
}
}
return new FooEquipment();
});
如果您随后调用 Mapper.Map<IEnumerable<Foo>>(list)
它应该给你你想要的。或者我怀疑你想要什么:)
关于c# - AutoMapper 更改类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26495796/