AutoMapper:根据某些逻辑将目标属性映射到不同的源属性/类型

时间:2015-03-17 17:20:43

标签: .net automapper idatareader

我想将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属性。

我们可以使用内联代码实现这一点,还是必须使用Value Resolvers?

2 个答案:

答案 0 :(得分:0)

您是否尝试过使用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到目标...

答案 1 :(得分:0)

我想出了从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"));

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