【问题标题】:Mapping flattened object's properties as collection将展平对象的属性映射为集合
【发布时间】:2021-11-24 21:58:34
【问题描述】:

我的对象列表看起来像这样:

//SOURCE OBJECT
public class SourceObject
{
    public string Code { get; set; }
    public string Name { get; set; }
    public string ImageUri1 { get; set; }
    public string ImageUri2 { get; set; }
    public string ImageUri3 { get; set; }
    // etc...
}

//TARGET OBJECT
public class TargetObject
{
    public string Code { get; set; }
    public string Name { get; set; }

    public List<TargetObjectImage> Images {get;set;}
}

public class TargetObjectImage
{
    public string Name { get; set; }
    public string ImageUri { get; set; }
}

我需要使用 TargetObject 的导航属性将 SourceObject 的一些属性映射到嵌套集合 TargetObjectImage。

所以实际上,我想调用“UNPIVOT”操作。 此外,源数据结构并不总是必须存储所有图像,在这种情况下 ImageUri... 属性将为空,不应添加到嵌套集合中。

public class SourceObjectProfile : Profile
{
    public SourceObjectProfile()
    {
        var map = CreateMap<SourceObject, TargetObject>()
        .ForMember(o => o.Name, o => o.MapFrom(m => m.Name))
        .ForMember(o => o.Code, o => o.MapFrom(m => m.Code))
    }
}

我正在使用 AutoMapper。我可以问任何提示吗?

【问题讨论】:

  • 我们可以假设固定大小为 5 张图片,我不需要通用解决方案。

标签: mapping automapper unpivot


【解决方案1】:

这是工作代码:

    public class CustomResolver : IValueResolver<SourceObject, TargetObject, List<TargetObjectImage>>
    {
        public List<TargetObjectImage> Resolve(SourceObject source, TargetObject destination, List<TargetObjectImage> destMember, ResolutionContext context)
        {
            return new List<TargetObjectImage>
                        {
                            new TargetObjectImage
                            {
                                Uri = source.ImageUri1
                            },
                            new TargetObjectImage
                            {
                                Uri = source.ImageUri2
                            },
                            new TargetObjectImage
                            {
                                Uri = source.ImageUri3
                            },
                        };     
        }
    }

    public class SourceObjectProfile : Profile
    {
        public SourceObjectProfile()
        {
            var map = CreateMap<SourceObject, TargetObject>()
            .ForMember(o => o.Name, o => o.MapFrom(m => m.Name))
            .ForMember(o => o.Code, o => o.MapFrom(m => m.Code))
            .ForMember(o => o.Images, o => o.MapFrom(new CustomResolver()));
        }
    }

【讨论】:

  • 前两个MapFrom-s 没用。
猜你喜欢
  • 2014-12-03
  • 2012-11-08
  • 1970-01-01
  • 2016-06-27
  • 2019-04-06
  • 1970-01-01
  • 2011-08-21
  • 2017-03-16
  • 1970-01-01
相关资源
最近更新 更多