我正在尝试从源的子对象映射到目标(作为父对象)。
源型号:
public class SourceBaseResponse<T> where T : new()
{
public string Type { get; set; }
public string Id { get; set; }
public T Attributes { get; set; }
}
对于我的示例,我使用 T 为 SourceAssignment 类型
public class SourceAssignment
{
public string Id { get; set; }
public string Email { get; set; }
public string EmployeeId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public DateTimeOffset CreatedAt { get; set; }
}
目标对象
public class DestinationAssignment
{
public string Id { get; set; }
public string Email { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
我想将源模型直接映射到目标。所以,我试图使用
CreateMap<SourceAssignment, DestinationAssignment>();
CreateMap<SourceBaseResponse<SourceAssignment>, DestinationAssignment>()
.ForMember(dest => dest, opt => opt.MapFrom(src => AutoMapperConfig.Mapper.Map<DestinationAssignment>(src.Attributes)));
这不起作用,因为我在上面的行中遇到运行时错误,即“仅支持类型上的顶级个人成员”。
所以,根据这个线程我尝试了以下
CreateMap<SourceBaseResponse<SourceAssignment>, DestinationAssignment>()
.AfterMap((src, dst) => Mapper.Map(src.Attributes, dst));
现在,我在应该发生映射的地方遇到错误,上面写着“映射器未初始化。使用适当的配置调用初始化。如果您尝试通过容器或其他方式使用映射器实例,请确保您没有对静态映射器的任何调用。 Map 方法,如果您使用 ProjectTo 或 UseAsDataSource 扩展方法,请确保传入适当的 IConfigurationProvider 实例。”
我可以为每个属性使用 ForMember 并将其从 src.Attributes 映射到 dest(例如:src.Attribute.Id 到 dest.Id)。这行得通,但我真的不想这样做,因为我的 Source 是涉及嵌套子级的复杂类(因为这是一个 Web API 响应,我无法控制它)。所以这里做了很多自定义映射
CreateMap<SourceAssignment, DestinationAssignment>();
关于如何进行的任何建议。