跟进this答案时我遇到了错误。 我有三个课程,以及它们各自的 DTO:
public class ClassA
{
public string Name { get; set; }
public List<ClassB> Children { get; set; }
}
public class ClassB
{
public int Type { get; set; }
public ClassC Value { get; set; }
}
public class ClassC
{
public string Name { get; set; }
}
public class ClassADto
{
public string Name { get; set; }
public List<ClassB> Children { get; set; }
}
public class ClassBDto
{
public int Type { get; set; }
public ClassC Value { get; set; }
}
public class ClassCDto
{
public string Name { get; set; }
}
我有以下映射配置:
public class MyProfile : Profile
{
// the converter is registered in ServiceCollection
public MyProfile(IValueConverter<string, string> valueConverter)
{
this.CreateMap<ClassA, ClassADto>().ReverseMap();
this.CreateMap<ClassB, ClassBDto>()
.BeforeMap((source, destination, context) =>
{
if (context.TryGetItems(out var items))
{
items["ClassBDto"] = source;
}
})
.ReverseMap();
this.CreateMap<ClassC, ClassCDto>();
this.CreateMap<ClassCDto, ClassC>()
.ForMember(field => field.Name, opt => opt.ConvertUsing(valueConverter));
}
}
转换器本身:
public class MyValueConverter : IValueConverter<string, string>
{
public string Convert(string sourceMember, ResolutionContext context)
{
var retVal = sourceMember;
if ((ClassBDto)(context.Items["ClassBDto"]).Type == 1) retVal += "Type is 1";
return retVal;
}
}
但是当运行映射并检查ResolutionContext时,我收到错误:
Context.Items are only available when using a Map overload that takes Action<IMappingOperationOptions>! Consider using Context.TryGetItems instead.
当我在
var retVal = sourceMember;
上放置断点并观察 ResolutionContext context
变量时,我观察到了此错误;
有人可以告诉我我做错了什么吗?
致以诚挚的问候
根据文档所述,从版本 12 开始,它限制了
Context.Items
的访问。
此外,只有在将地图调用为
文档时,才可以向
Context.Options
提供附加值。
我不明白你为什么要让它变得复杂,你可以使用
.ForPath
将值从父字段传递并分配给子字段,如下所示:
this.CreateMap<ClassB, ClassBDto>();
this.CreateMap<ClassBDto, ClassB>()
.ForPath(
dest => dest.Value.Name,
opt => opt.MapFrom(src => src.Value.Name + (src.Type == 1 ? "Type is 1": ""))
);