【问题标题】:AutoMapper : Map a destination property to a different source property/type based on some logicAutoMapper:根据某些逻辑将目标属性映射到不同的源属性/类型
【发布时间】:2015-03-18 02:28:26
【问题描述】:

我想将 Source 对象映射到 Destination 对象,该对象具有一些不直接等同于源属性的额外属性。考虑下面的例子:

class Source { string ImageFilePath; }

class Destination { bool IsFileSelected; bool IsFileGif; }

IsFileGif 的映射逻辑:

destinationObj.IsFileGif = Path.GetExtension(sourceObj.ImageFilePath) == ".gif" ? true : false;

IsFileSelected 的映射逻辑:

destinationObj.IsFileSelected = string.IsNullOrEmpty(sourceObj.ImageFilePath) ? false : true;

另外,由于我的源是 IDataReader,我想知道如何将 IDataReader 对象的字段/列映射到我的 Destination 属性。

我们可以使用内联代码来实现这一点,还是必须为此使用值解析器?

【问题讨论】:

    标签: .net automapper idatareader


    【解决方案1】:

    您是否尝试过使用 MapFrom 方法?

    Mapper.CreateMap<Source , Destination>()
     .ForMember(dest => dest.IsFileGif, opt => opt.MapFrom(src => Path.GetExtension(sourceObj.ImageFilePath) == ".gif")
     .ForMember(dest => dest.IsFileSelected, opt =>  opt.MapFrom(src => !string.IsNullOrEmpty(sourceObj.ImageFilePath));
    

    关于 IDataReader,我认为您应该在类之间进行映射(源到目标),而不是从 IDataReader 到目标...

    【讨论】:

    • 感谢@Igomide,MapFrom 方法有效。为简单起见,仅使用 Source 类。在我的真实场景中,源实际上是从数据库中检索的 DataTable 对象创建的 IDataReader。我已经编写了一个通用扩展方法,它将执行 IDataReader -> IEnumerable 映射。
    【解决方案2】:

    我发现了从 IDataReader 到 Destination 对象的映射:

    Mapper.CreateMap<IDataReader, Destination>()
                        .ForMember(d => d.IsFileSelected,
                             o => o.MapFrom(s => !string.IsNullOrEmpty(s.GetValue(s.GetOrdinal("ImageFilePath")).ToString())))
                        .ForMember(d => d.IsFileGif,
                             o => o.MapFrom(s => Path.GetExtension(s.GetValue(s.GetOrdinal("ImageFilePath")).ToString()) == ".gif"));
    

    如果有人验证此代码或建议是否存在更好的替代方案,将不胜感激。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-30
      • 2019-04-12
      • 1970-01-01
      • 2012-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多