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 TitleResolver : IValueResolver<Item, ItemDetail, string>
public string Resolve(Item source, ItemDetail destination, string destMember, ResolutionContext context)
if (source.BookMetadata != null)
return source.BookMetadata.Title;
if (source.MovieMetadata != null)
return source.MovieMetadata.Title;
public class ItemProfile : Profile
CreateMap<Item, ItemDetail>()
.ForMember(dest => dest.Title, opt => opt.MapFrom<TitleResolver>());
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}");