Reputation: 6770
Issue with a particular type of mapping with classes SourceClass and DestinationClass
public class SourceClass
{
public int Id { get; set; }
public string Name { get; set; }
public ICollection<SourceNestedClass> SourceNestedClasses { get; set; }
}
public class SourceNestedClass
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
public class DestNestedClass
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string FullName { get; set; }
}
public class DestinationClass
{
public int Id { get; set; }
public string Name { get; set; }
public ICollection<DestNestedClass> Nesteds { get; set; }
}
public DestinationClass MapAutomatically(SourceClass source)
{
Mapper.CreateMap<SourceClass, DestinationClass>()
.ForMember(dest => dest.Nesteds, opt => opt.Ignore())
.AfterMap((src, dest) =>
{
dest.Nesteds.Clear();
foreach (var nested in src.SourceNestedClasses )
{
DestNestedClass destNest=new DestNestedClass();
destNest.Id=nested.Id;
destNest.FirstName=nested.FirstName;
destNest.LastName=nested.LastName;
destNest.FullName=nested.FullName;
dest.Nesteds.Add(destNest);
}
});
return Mapper.Map<DestinationClass>(source);
}
Want to avoid manual mapping option in MapAutomatically. In this process need to map each properties.To avoid manual mapping is there any process to use bellow syntax.
Mapper.CreateMap<SourceNestedClass, DestNestedClass>()
.ForMember(dest => dest.FullName, opt => opt.FirstName+opt.LastName);
Upvotes: 1
Views: 150
Reputation: 6770
The syntax is descriptive, for nested class mapping with automapper need to take care parent class and child classes as like following
- mapping parent classes with nested classes
- mapping classes
public class SourceClass
{
public int Id { get; set; }
public string Name { get; set; }
public ICollection<SourceNestedClass> SourceNestedClasses { get; set; }
public SourceClass()
{
SourceNestedClasses = new List<SourceNestedClass>();
}
}
public class SourceNestedClass
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
public class DestNestedClass
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string FullName { get; set; }
}
public class DestinationClass
{
public int Id { get; set; }
public string Name { get; set; }
public ICollection<DestNestedClass> Nesteds { get; set; }
public DestinationClass()
{
Nesteds = new List<DestNestedClass>();
}
}
class Program
{
public static DestinationClass MapAutomatically(SourceClass sourceInfo)
{
var config = new MapperConfiguration(cfg =>
{
//mapping parent classes with nested classes
cfg.CreateMap<SourceClass, DestinationClass>()
.ForMember(dest => dest.Nesteds, opt => opt.MapFrom(source => source.SourceNestedClasses));
//mapping classes
cfg.CreateMap<SourceNestedClass, DestNestedClass>()
.ForMember(dest => dest.FullName, opt => opt.MapFrom(source => source.FirstName + source.LastName));
});
var mapper = config.CreateMapper();
var destResult = mapper.Map<SourceClass, DestinationClass>(sourceInfo);
return destResult;
}
static void Main(string[] args)
{
var sourceInfo = new SourceClass
{
Id = 5,
Name = "SourceClass",
SourceNestedClasses = { new SourceNestedClass { Id = 10, FirstName = "Test", LastName = "Address" } }
};
var destResult = MapAutomatically(sourceInfo);
}
}
}
Upvotes: 1