public MovieMetadata MovieMetadata { get; set; }
public BookMetadata BookMetadata { get; set; }
public class MovieMetadata
public string Title { get; set; }
public class BookMetadata
public string Title { get; set; }
public string Title { get; set; }
public class ItemProfile : Profile
CreateMap<Item, ItemDetail>(MemberList.None)
.AfterMap((src, dest, ctx) =>
if (src.BookMetadata != null)
ctx.Mapper.Map(src.BookMetadata, dest);
else if (src.MovieMetadata != null)
ctx.Mapper.Map(src.MovieMetadata, dest);
CreateMap<BookMetadata, ItemDetail>();
CreateMap<MovieMetadata, ItemDetail>();
public static void Main()
var configuration = new MapperConfiguration(cfg =>
cfg.AddMaps(typeof(ItemProfile));
var mapper = configuration.CreateMapper();
mapper.ConfigurationProvider.AssertConfigurationIsValid();
Console.WriteLine("Mapper configuration is valid");
BookMetadata = new BookMetadata()
var bookItemDetail = mapper.Map<ItemDetail>(bookItem);
bool isBookCorrectlyMapped = bookItem.BookMetadata.Title == bookItemDetail.Title;
Console.WriteLine($"Book mapped correctly: {isBookCorrectlyMapped}");
MovieMetadata = new MovieMetadata()
var movieItemDetail = mapper.Map<ItemDetail>(movieItem);
bool isMovieCorrectlyMapped = movieItem.MovieMetadata.Title == movieItemDetail.Title;
Console.WriteLine($"Movie mapped correctly: {isMovieCorrectlyMapped}");