C# 自动映射更改类型

C# 自动映射更改类型,c#,automapper-2,automapper-3,C#,Automapper 2,Automapper 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 };

鉴于以下情况:

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 };
我是否可以使用AutoMapper通过检查它们的父项,将这些
FooEquipment
转换为
AFooEquipment
BFooEquipment
?也就是说,在映射器中,我会看到object1属于(a)类的类型,因此我将其设备转换为->
列表
。它会看到object2在一个typeof(B)类中,所以我转换它的设备->
List


这可能吗?

我正在使用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();
  });
CreateMap()
.包括()
.Include();
CreateMap();
CreateMap();
CreateMap()
.ConstructUsing((ResolutionContext ctx)=>
{
if(ctx.Parent!=null)//Parent将指向设备属性
{
var foopparent=ctx.Parent.Parent;//将指向Foo,A或B。
if(fooParent!=null)
{
如果(fooParent.SourceType==typeof(A))返回新的AFOEEquipment();
如果(foopparent.SourceType==typeof(B))返回新的BFooEquipment();
}
}
归还新设备();
});

如果您随后调用
Mapper.Map(list)
,它将为您提供所需的内容。或者我猜你想要什么:)

是的,实际上很简单。你试过这个吗?我在代码的另一部分成功地使用了这种方法。我试过这个例子,但它似乎不起作用。如果这确实是正确的方法,也许我把我的映射连接错了,那么这种方法将如何选择是使用FooEquipment还是BFooEquipment?
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();
  });