AutoMapper和继承 - 如何映射? [英] AutoMapper and inheritance - How to Map?
本文介绍了AutoMapper和继承 - 如何映射?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
有这种情况:
public class Base { public string Name; }
public Class ClassA :Base { public int32 Number; }
public Class ClassB :Base { public string Description;}
public Class DTO {
public string Name;
public int32 Number;
public string Description;
}
我有一个 IList< Base>
我的地图是:
I have an IList<Base>
my maps are:
AutoMapper.Mapper.CreateMap<IList<Base>, IList<DTO>>()
.ForMember(dest => dest.Number, opt => opt.Ignore())
.ForMember(dest => dest.Description, opt => opt.Ignore());
AutoMapper.Mapper.CreateMap<ClassA, DTo>()
.ForMember(dest => dest.Description, opt => opt.Ignore());
AutoMapper.Mapper.CreateMap<ClassB, DTO>()
.ForMember(dest => dest.Number, opt => opt.Ignore())
Mapper.AssertConfigurationIsValid(); //Is OK!
但是当我这样做时,不会映射ClassA或ClassB中的属性:
But Properties that are in ClassA Or ClassB are not mapped when I do this :
IList<DTO>= AutoMapper.Mapper.Map<IList<Base>,IList<DTO>>(baseList);
如何映射 ClasA $中定义的属性c $ c>和
ClassB
推荐答案
您需要创建DTO与您的域类匹配的类如下:
You will need to create DTO classes that match your domain classes like this:
public class DTO
{
public string Name;
}
public class DTO_A : DTO
{
public int Number { get; set; }
}
public class DTO_B : DTO
{
public string Description { get; set; }
}
然后您需要将映射更改为:
You then need to change your mappings to this:
Mapper.CreateMap<Base, DTO>()
.Include<ClassA, DTO_A>()
.Include<ClassB, DTO_B>();
Mapper.CreateMap<ClassA, DTO_A>();
Mapper.CreateMap<ClassB, DTO_B>();
Mapper.AssertConfigurationIsValid();
完成后,以下内容将起作用:
Once this is done, then the following will work:
var baseList = new List<Base>
{
new Base {Name = "Base"},
new ClassA {Name = "ClassA", Number = 1},
new ClassB {Name = "ClassB", Description = "Desc"},
};
var test = Mapper.Map<IList<Base>,IList<DTO>>(baseList);
Console.WriteLine(test[0].Name);
Console.WriteLine(test[1].Name);
Console.WriteLine(((DTO_A)test[1]).Number);
Console.WriteLine(test[2].Name);
Console.WriteLine(((DTO_B)test[2]).Description);
Console.ReadLine();
不幸的是,这确实意味着你有一个不受欢迎的演员阵容,但我认为你不是很多可以做到这一点。
Unfortunately this does mean that you have an unwanted cast, but I don't think there's much that you can do about that.
这篇关于AutoMapper和继承 - 如何映射?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文