I'm having some trouble mapping my parent class using automapper. Given the following classes, I have created a mapping profile.
Mapping classes:
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; }
}
Map:
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));
}
}
And finally my program:
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
}
The problem is, when I try mapping to the derived classes, my parent class' properties won't get mapped in case of TargetClass1
but it will for TargetClass2
. Can anyone explain to me what it is I'm doing wrong, and why these 2 maps are acting differently? (Does the order in which I Include
matter?)
Edit: On close inspection, the order does indeed matter. However, I still don't know why only the second Include
would count.
Edit2: Based on the comment by @GruffBunny, I think I could "fix" this by using an Extension Method. However, I don't really get why they made it this way. Looking at the code for AutoMapper.TypeMap
, I can clearly see this:
public void IncludeDerivedTypes(Type derivedSourceType, Type derivedDestinationType)
{
_includedDerivedTypes[derivedSourceType] = derivedDestinationType;
}
Obviously this means you can only specify one destination per included source type. I don't see anything, that would prevent them from supporting more than one destinationtype, however.