有没有一种方法可以告诉AutoMapper忽略除了明确定义映射的属性以外的所有属性?
我有一些外部的DTO类,这些类可能会从外部发生变化,我想避免明确指定要忽略每个属性,因为添加新属性时,将尝试将它们映射到我的对象中会导致功能出现问题(引起异常)。
有没有一种方法可以告诉AutoMapper忽略除了明确定义映射的属性以外的所有属性?
我有一些外部的DTO类,这些类可能会从外部发生变化,我想避免明确指定要忽略每个属性,因为添加新属性时,将尝试将它们映射到我的对象中会导致功能出现问题(引起异常)。
您希望如何指定忽略某些成员?是否有惯例、基类或属性可以应用?一旦您开始明确指定所有映射,我不确定您会从AutoMapper中获得什么价值。
这似乎是一个老问题,但我想为任何像我一样在寻找答案的人发布我的答案。
我使用ConstructUsing和对象初始化器结合ForAllMembers忽略例如:
Mapper.CreateMap<Source, Target>()
.ConstructUsing(
f =>
new Target
{
PropVal1 = f.PropVal1,
PropObj2 = Map<PropObj2Class>(f.PropObj2),
PropVal4 = f.PropVal4
})
.ForAllMembers(a => a.Ignore());
默认情况下,AutoMapper使用目标类型来验证成员,但您可以通过使用MemberList.None选项来跳过验证。
var configuration = new MapperConfiguration(cfg =>
cfg.CreateMap<Source2, Destination2>(MemberList.None);
);
AutoMapper.Extensions.Microsoft.DependencyInjection
,我在 mapper 配置文件中这样写。虽然我不怎么熟悉 AutoMapper ,但它现在似乎能正常处理未映射成员。var mapperConfig = new MapperConfiguration(mc => mc.AddProfile(new AutoMapperProfile()));
services.AddSingleton(mapperConfig.CreateMapper());
在我的AutoMapper配置文件中:
CreateMap<ProjectActivity, Activity>()
.ForMember(dest => dest.ActivityName, opt => opt.MapFrom(src => src.Name))
.ValidateMemberList(MemberList.None);
.ValidateMemberList(MemberList.None)
和 .ForAllOtherMembers(x => x.Ignore())
之间的区别是什么? - Nicholas Petersenthis.IgnoreUnmapped();
CreateMap<TSource, Tdestination>(MemberList.Destination)
.ForMember(dest => dest.SomeProp, opt => opt.MapFrom(src => src.OtherProp));
public static IMappingExpression<TSource, TDest> IgnoreAll<TSource, TDest>(this IMappingExpression<TSource, TDest> expression)
{
expression.ForAllMembers(opt => opt.Ignore());
return expression;
}
注意,它会忽略所有内容,如果您不添加自定义映射,则已经被忽略并且将无法工作
另外,我想说,如果您对AutoMapper进行单元测试,并测试了所有模型及其所有属性是否正确映射,则不应使用此类扩展方法
您应该明确写出要忽略的内容
DestSampleObjetc dest = new();
dest = mapper.Map(source, dest);
cfg.ShouldMapProperty = p => false;
版本12 这是一段极其糟糕的代码,但它解决了紧急工作。
CreateMap<RepairPutRequest, Repair>(MemberList.None)
.ForAbdusselamMember(x => x.ClosedLostTimeId, y => y.MapFrom(z => z.ClosedLostTimeId))
.ForAbdusselamMember(x => x.Explanation, y => y.MapFrom(z => z.Explanation)).IgnoreUnmapped()
;
public static class MappingExtensions
{
public static Dictionary<string, List<string>> list = new Dictionary<string, List<string>>();
public static IMappingExpression<TSource, TDestination> IgnoreUnmapped<TSource, TDestination>(this IMappingExpression<TSource, TDestination> expression)
{
var sourceType = typeof(TSource);
var destinationType = typeof(TDestination);
var key =$"{sourceType.FullName}__||__{destinationType.FullName}" ;
var t = list[key];
foreach (var item in destinationType.GetProperties())
{
if (!t.Contains(item.Name)) {
expression.ForMember(item.Name, x => x.Ignore());
}
}
return expression;
}
public static IMappingExpression<TSource, TDestination> ForAbdusselamMember<TSource, TDestination, TMember>(this IMappingExpression<TSource, TDestination> expression,
Expression<Func<TDestination, TMember>> destinationMember, Action<IMemberConfigurationExpression<TSource, TDestination, TMember>> memberOptions )
{
var sourceType = typeof(TSource);
var destinationType = typeof(TDestination);
var key = $"{sourceType.FullName}__||__{destinationType.FullName}";
if (!list.ContainsKey(key))
{
list[key]=new List<string>();
}
expression.ForMember(destinationMember, memberOptions);
var memberInfo = ReflectionHelper.FindProperty(destinationMember);
list[key].Add(memberInfo.Name);
return expression;
}
}
.ForAllOtherMembers(opts => opts.Ignore())
的答案。 - Jack Ukleja