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(如果有人对过时的警告表示同意,则适用于当前版本)。