我在使用 automapper 映射我的父类时遇到了一些问题。给定以下类,我创建了一个映射配置文件。
映射类:
public class SourceClass
{
public int SourceProperty1 { get; set; }
public int SourceProperty2 { get; set; }
public string SourceProperty3 { get; set; }
public string SourceProperty4 { get; set; }
}
public class TargetBaseClass
{
public int TargetProperty1 { get; set; }
public int TargetProperty2 { get; set; }
}
public class TargetClass1: TargetBaseClass
{
public string TargetProperty3 { get; set; }
}
public class TargetClass2: TargetBaseClass
{
public string TargetProperty4 { get; set; }
}
地图:
public class MappingProfile: Profile
{
protected override void Configure()
{
CreateMap<SourceClass, TargetBaseClass>()
.Include<SourceClass, TargetClass1>()
.Include<SourceClass, TargetClass2>()
.ForMember(dst => dst.TargetProperty1, opt => opt.MapFrom(src => src.SourceProperty1))
.ForMember(dst => dst.TargetProperty2, opt => opt.MapFrom(src => src.SourceProperty2));
CreateMap<SourceClass, TargetClass1>()
.ForMember(dst => dst.TargetProperty3, opt => opt.MapFrom(src => src.SourceProperty3));
CreateMap<SourceClass, TargetClass2>()
.ForMember(dst => dst.TargetProperty4, opt => opt.MapFrom(src => src.SourceProperty4));
}
}
最后是我的程序:
static void Main(string[] args)
{
Mapper.Initialize(x => x.AddProfile<MappingProfile>());
var sourceClass = new SourceClass
{
SourceProperty1 = 1,
SourceProperty2 = 2,
SourceProperty3 = "3",
SourceProperty4 = "4"
};
var targetBaseClass = Mapper.Map<TargetBaseClass>(sourceClass);
var targetClass1 = Mapper.Map<TargetClass1>(sourceClass);
var targetClass2 = Mapper.Map<TargetClass2>(sourceClass);
Console.WriteLine("TargetBaseClass: {0} {1}", targetBaseClass.TargetProperty1,
targetBaseClass.TargetProperty2); //1 2
Console.WriteLine("TargetClass1: {0} {1} {2}", targetClass1.TargetProperty1, targetClass1.TargetProperty2,
targetClass1.TargetProperty3);//0 0 3 ???
Console.WriteLine("TargetClass2: {0} {1} {2}", targetClass2.TargetProperty1, targetClass2.TargetProperty2,
targetClass2.TargetProperty4);//1 2 4
}
问题是,当我尝试映射到派生类时,我的父类的属性不会被映射,但TargetClass1
它会映射. TargetClass2
谁能向我解释我做错了什么,为什么这两张地图表现不同?(我的顺序Include
重要吗?)
编辑:仔细检查,订单确实很重要。但是,我仍然不知道为什么只有第二个Include
才算数。
Edit2:根据@GruffBunny 的评论,我想我可以通过使用扩展方法来“修复”这个问题。但是,我真的不明白他们为什么这样做。查看 的代码AutoMapper.TypeMap
,我可以清楚地看到:
public void IncludeDerivedTypes(Type derivedSourceType, Type derivedDestinationType)
{
_includedDerivedTypes[derivedSourceType] = derivedDestinationType;
}
显然,这意味着您只能为每个包含的源类型指定一个目标。但是,我看不到任何东西,这会阻止他们支持多个目标类型。