自动映射器“映射一些并忽略其余的”

ste*_*teb 13 c# mapping automapper

我知道有很多关于此的问题(和答案),但是当使用 .net6 和 automapper 11.01.1 时,这些问题都不适合我。他们似​​乎已经删除了其中的许多IgnoreIgnoreAllUnmapped并且ForAllOtherMembers在最新的 automapper 中。如果我使用ignore with ForAllMembers(before或after ForMember),它将忽略所有字段,甚至是我用地图指定的字段。

问题:我有两个具有相同名称字段的类,但我只想映射一些并忽略其余的。(请不要说“为什么需要自动映射器”,这不是这里的问题)。

在这种情况下我需要使用自动映射器,但不确定他们是否不再支持这个?我可能错过了一个nuget吗?我只使用“AutoMapper 11.01.1”

public class User1
{
    public string Name { get; set; } = "Foo";
    public int Age { get; set; } = 7;
    public string Phone { get; set;} = "123456789";
}
public class User2
{ 
    public string FirstLastName { get; set; }
    public int Age { get; set; }
    public string Phone { get; set; }
}

public class AutoMapperProfile : Profile
{
    public AutoMapperProfile()
    {
        CreateMap<User1, User2>()
            .ForMember(dest => dest.FirstLastName, opt => opt.MapFrom(src => src.Name))
            //.ForMember(dest => dest.Age, src => src.Ignore());  // works BUT I do not want to ignore every field manually
            //.ForAllMembers(dest => dest.Ignore())               // doesn't work, clears all fields
            //.ValidateMemberList(MemberList.None)                // doesn't work
            ;
    }
}

void Main()
{
    var user1 = new User1();
    
    var config = new MapperConfiguration(mc => mc.AddProfile(new AutoMapperProfile()));
    Mapper mapper = new Mapper(config);
    
    var user2 = mapper.Map<User2>(user1);
    user2.Dump();
}
Run Code Online (Sandbox Code Playgroud)

小智 18

我们遇到了同样的问题。我创建了这个扩展方法,它应该提供您正在寻找的功能。

public static IMappingExpression<TSource, TDestination> IgnoreAllMembers<TSource, TDestination>(this IMappingExpression<TSource, TDestination> expr)
{
    var destinationType = typeof(TDestination);

    foreach (var property in destinationType.GetProperties())
        expr.ForMember(property.Name, opt => opt.Ignore());

    return expr;
}
Run Code Online (Sandbox Code Playgroud)

它的用法:

CreateMap<ModelOne, ModelTwo>()
    .IgnoreAllMembers()
    .ForMember(x => x.DescriptionOne, opt => opt.MapFrom(y => y.DescriptionOne));
Run Code Online (Sandbox Code Playgroud)

它的工作原理是循环遍历目标类型的所有属性并忽略它们。这意味着需要在提供成员映射之前调用它。之后调用它会覆盖您的映射。

希望这可以帮助。

  • 太好了,谢谢您的回复。我想没有办法再用自动映射器来做到这一点了,这太奇怪了。 (3认同)
  • @steb,你对此比我在尝试升级以让 .NET 7 正常工作时发现这一点更有礼貌。考虑到我的代码已经运行良好 3 年了,我尤其恼火。 (2认同)