如何在C#中批量将相似类属性值赋值并忽略指定属性
批量属性赋值方案(忽略指定属性)
方法1:使用AutoMapper(推荐,简洁易维护)
AutoMapper是专门处理对象映射的类库,配置一次即可复用,非常适合多属性的对象映射场景。
操作步骤:
- 安装AutoMapper NuGet包:
Install-Package AutoMapper
- 创建映射配置,明确忽略
Email属性:
var config = new MapperConfiguration(cfg => { cfg.CreateMap<UserClient, UserServer>() .ForMember(dest => dest.Email, opt => opt.Ignore()); // 跳过Email属性的映射 });
注:同名同类型的属性会自动完成映射,无需手动指定
3. 执行映射:
IMapper mapper = config.CreateMapper(); UserServer UServer = mapper.Map<UserServer>(UClient);
如果是ASP.NET Core项目,可将AutoMapper注册为全局服务,后续直接注入使用。
方法2:反射实现自定义批量赋值(无需第三方库)
若不想引入外部依赖,可通过反射遍历属性,自动赋值同名同类型的属性,同时跳过指定属性。
自定义工具方法:
public static void MapProperties<TSource, TTarget>(TSource source, TTarget target, params string[] ignoreProperties) { var sourceProps = typeof(TSource).GetProperties(BindingFlags.Public | BindingFlags.Instance) .Where(p => p.CanRead && !ignoreProperties.Contains(p.Name)); var targetProps = typeof(TTarget).GetProperties(BindingFlags.Public | BindingFlags.Instance) .Where(p => p.CanWrite); foreach (var sourceProp in sourceProps) { var targetProp = targetProps.FirstOrDefault(p => p.Name == sourceProp.Name && p.PropertyType == sourceProp.PropertyType); if (targetProp != null) { var value = sourceProp.GetValue(source); targetProp.SetValue(target, value); } } }
使用方式:
MapProperties(UClient, UServer, "Email");
执行后,UClient中除Email外的同名同类型属性值会自动赋值给UServer。
方法3:扩展方法封装(适合固定结构场景)
如果两个类的属性结构长期稳定,可封装扩展方法实现映射,这种方式性能最优,但属性变动时需同步更新方法:
public static UserServer ToUserServer(this UserClient client) { return new UserServer { Id = client.Id, Username = client.Username // 不处理Email属性 }; }
使用方式:
UserServer UServer = UClient.ToUserServer();
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

