ste*_*teb 13 c# mapping automapper
我知道有很多关于此的问题(和答案),但是当使用 .net6 和 automapper 11.01.1 时,这些问题都不适合我。他们似乎已经删除了其中的许多Ignore,IgnoreAllUnmapped并且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)
它的工作原理是循环遍历目标类型的所有属性并忽略它们。这意味着需要在提供成员映射之前调用它。之后调用它会覆盖您的映射。
希望这可以帮助。
| 归档时间: |
|
| 查看次数: |
5791 次 |
| 最近记录: |