Inheritance 使用派生类型从基列表映射到另一个基列表

Inheritance 使用派生类型从基列表映射到另一个基列表,inheritance,automapper,Inheritance,Automapper,我正在尝试绘制如下的地图 public abstract class AnimalBLO { } public abstract class AnimalDLO { } public class HumanBLO : AnimalBLO { } public class HumanDLO : AnimalDLO { } public class LionBLO : AnimalBLO { } public class LionDLO : AnimalDLO { } internal

我正在尝试绘制如下的地图

public abstract class AnimalBLO { }

public abstract class AnimalDLO { }

public class HumanBLO : AnimalBLO { }

public class HumanDLO : AnimalDLO { }

public class LionBLO : AnimalBLO { }

public class LionDLO : AnimalDLO { }

internal class Program
{
    private static void Main(string[] args)
    {
        Mapper.CreateMap<HumanDLO, HumanBLO>();
        Mapper.CreateMap<LionDLO, LionBLO>();

        var dlos = new List<AnimalDLO>()
        {
            new HumanDLO(),
            new LionDLO()
        };

        var result = Mapper.Map<List<AnimalBLO>>(dlos);

    }
}
公共抽象类AnimalBLO{}
公共抽象类AnimalDLO{}
公共类HumanBLO:AnimalBLO{}
公共类HumanDLO:AnimalDLO{}
公共类LionBLO:AnimalBLO{}
公共类LionDLO:AnimalDLO{}
内部课程计划
{
私有静态void Main(字符串[]args)
{
CreateMap();
CreateMap();
var dlos=新列表()
{
新HumanDLO(),
新的LionDLO()
};
var result=Mapper.Map(dlos);
}
}
其中,列表的基类型是AnimalBLO,但它们被映射为派生类型。有没有办法做到这一点而不丢弃所有对象,然后将它们重新组合在一起

我认为这个代码会起作用:

        Mapper.CreateMap<AnimalDLO, AnimalBLO>()
            .Include<HumanDLO, HumanBLO>()
            .Include<LionDLO, LionBLO>();

        Mapper.CreateMap<HumanDLO, HumanBLO>();
        Mapper.CreateMap<LionDLO, LionBLO>();
Mapper.CreateMap()
.包括()
.Include();
CreateMap();
CreateMap();
但是,会引发以下异常消息:

{“无法创建抽象类的实例。”}

AutoMapper的功能与您描述的完全一样。我向类添加了
标记
属性,以验证调用了哪个映射:

public abstract class AnimalBLO
{
    public string Tag { get; set; }
}
以下是成功的测试:

[SetUp]
public void SetUp()
{
    Mapper.Initialize(cfg => {
        cfg.CreateMap<AnimalDLO, AnimalBLO>()
              .Include<HumanDLO, HumanBLO>()
              .Include<LionDLO, LionBLO>();
        cfg.CreateMap<HumanDLO, HumanBLO>().AfterMap((src, dest) => dest.Tag = "mapped as Human");
        cfg.CreateMap<LionDLO, LionBLO>();
    });
}

[Test]
public void Test()
{
    var dlos = new List<AnimalDLO>
    {
        new HumanDLO(),
        new LionDLO()
    };

    var result = Mapper.Map<List<AnimalBLO>>(dlos);
    var human = result.First();

    Assert.IsInstanceOf(typeof(HumanBLO), human);
    Assert.AreEqual("mapped as Human", human.Tag);
} 
[设置]
公共作废设置()
{
Mapper.Initialize(cfg=>{
cfg.CreateMap()
.包括()
.Include();
cfg.CreateMap().AfterMap((src,dest)=>dest.Tag=“映射为人”);
CreateMap();
});
}
[测试]
公开无效测试()
{
var dlos=新列表
{
新HumanDLO(),
新的LionDLO()
};
var result=Mapper.Map(dlos);
var human=result.First();
Assert.IsInstanceOf(typeof(HumanBLO),human);
Assert.AreEqual(“映射为人”,Human.Tag);
} 
版本4.2(可能是5.X)解决方案如下所示:

var config = new MapperConfiguration(cfg =>
{

    cfg.CreateMap<AnimalDLO, AnimalBLO>()
        .Include<HumanDLO, HumanBLO>()
        .Include<LionDLO, LionBLO>();

    cfg.CreateMap<HumanDLO, HumanBLO>();
    cfg.CreateMap<LionDLO, LionBLO>();
});

var dlos = new List<AnimalDLO>
{
    new LionDLO(),
    new HumanDLO(),
};

var result = config.CreateMapper().Map<List<AnimalBLO>>(dlos);
var config=new-MapperConfiguration(cfg=>
{
cfg.CreateMap()
.包括()
.Include();
CreateMap();
CreateMap();
});
var dlos=新列表
{
新的LionDLO(),
新HumanDLO(),
};
var result=config.CreateMapper().Map(dlos);

这看起来正是我想要的,我今晚会测试它,很可能会接受!!谢谢。这看起来适用于较旧版本的AutoMapper(如果有人对过时的警告表示同意,则适用于当前版本)。