问题描述
C#/.NET应用程序编程开发中,我们可以使用AutoMapper快速解决不同实体之间的映射问题,但有时候两个实体间的映射时需要忽略部分属性的映射,这时应该如何处理呢?
方案一
AutoMapper提供了忽略属性映射的方法,在AutoMapper配置时调用ForMember()
方法的Ignore()
,如下:
CreateMap<Foo, Bar>().ForMember(x => x.Blarg, opt => opt.Ignore());
方案二
为了方便,我们还可以创建一个泛型的扩展方法,如下:
public static IMappingExpression<TSource, TDestination> Ignore<TSource, TDestination>(
this IMappingExpression<TSource, TDestination> map,
Expression<Func<TDestination, object>> selector)
{
map.ForMember(selector, config => config.Ignore());
return map;
}
调用示例:
Mapper.CreateMap<JsonRecord, DatabaseRecord>()
.Ignore(record => record.Field)
.Ignore(record => record.AnotherField)
.Ignore(record => record.Etc);
方案三
如果你需要忽略两个实体间不一致的属性,则可以使用如下的扩展方法:
public static IMappingExpression<TSource, TDestination> IgnoreAllNonExisting<TSource, TDestination>(this IMappingExpression<TSource, TDestination> expression)
{
var sourceType = typeof(TSource);
var destinationType = typeof(TDestination);
var existingMaps = Mapper.GetAllTypeMaps().First(x => x.SourceType.Equals(sourceType)
&& x.DestinationType.Equals(destinationType));
foreach (var property in existingMaps.GetUnmappedPropertyNames())
{
expression.ForMember(property, opt => opt.Ignore());
}
return expression;
}
调用示例:
Mapper.CreateMap<SourceType, DestinationType>().IgnoreAllNonExisting();
方案四
使用ForSourceMember()
方法,如下:
conf.CreateMap<SourceType, DestinationType>()
.ForSourceMember(x => x.SourceProperty, y => y.Ignore());
版权声明:本作品系原创,版权归码友网所有,如未经许可,禁止任何形式转载,违者必究。
发表评论
登录用户才能发表评论, 请 登 录 或者 注册