私はマルチレベルのメンバーを持つオブジェクトをマップしようとしています:これらはクラスです:
public class Father
{
public int Id { get; set; }
public Son Son { get; set; }
}
public class FatherModel
{
public int Id { get; set; }
public int SonId { get; set; }
}
public class Son
{
public int Id { get; set; }
}
これは私がそれを自動マップしようとする方法です:
AutoMapper.Mapper.CreateMap<FatherModel , Father>()
.ForMember(dest => dest.Son.Id, opt => opt.MapFrom(src => src.SonId));
これは私が得る例外です:
式「dest => Convert(dest.Son.Id)」は、子オブジェクトのプロパティではなく、最上位のメンバーに解決する必要があります。代わりに、子タイプのカスタムリゾルバーまたはAfterMapオプションを使用してください。パラメーター名:lambdaExpression
ありがとう
これは、新しいオブジェクトまたは既存のオブジェクトへのマッピングの両方で機能します。
Mapper.CreateMap<FatherModel, Father>()
.ForMember(x => x.Son, opt => opt.MapFrom(model => model));
Mapper.CreateMap<FatherModel, Son>()
.ForMember(x => x.Id, opt => opt.MapFrom(model => model.SonId));
AutoMapper.Mapper.CreateMap<FatherModel, Father>()
.ForMember(x => x.Son, opt => opt.ResolveUsing(model => new Son() {Id = model.SonId}));
より複雑になっている場合は、ValueResolverクラスを記述できます。ここの例を参照してください http://automapper.codeplex.com/wikipage?title=Custom%20Value%20Resolvers
ForMemberではなくForPathを使用すると、魔法のように機能します。