自动映射器类型转换

3

以下是给定的内容:

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转换为AFooEquipmentBFooEquipment?也就是说,在映射器中,我会看到object1在typeof(A)类中,因此我将其设备转换为List<AFooEquipment>。它会看到object2在typeof(B)类中,所以我将其设备转换为List<BFooEquipment>。这可能吗?

是的,实际上非常容易。 - Darek
你尝试过这个吗?https://github.com/AutoMapper/AutoMapper/wiki/Mapping-inheritance - Sebastian Piu
我在代码的另一个部分成功地使用了这种方法。我尝试了这个实例,但似乎并没有起作用。如果那确实是正确的方法,也许我把我的映射接错了。 - Sebastian Patten
这种方法如何选择是使用AFooEquipment还是BFooEquipment? - Sebastian Patten
1个回答

1

我正在使用AutoMapper 3,所以这可能对您不起作用,但一个选项是使用ResolutionContextConstructUsing方法,类似于这样:

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),它应该会给您想要的东西。或者我猜您想要的 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接