如何遍历C#对象属性并更新另一对象的对应属性
解决方案
首先明确:因为两个对象是同类型的,通过GetType().GetProperties()获取的属性集合在两个对象上完全匹配,不需要额外对比属性名称或类型,直接用同一个PropertyInfo实例就能操作目标对象的对应属性。
修正你代码里的变量名错误(property应为prop),完整实现代码如下:
foreach (PropertyInfo prop in object1.GetType().GetProperties()) { var val = prop.GetValue(object1); if (val != null) { // 直接用当前prop设置object2的对应属性 prop.SetValue(object2, val); } }
补充说明
- 这段代码自动处理同类型对象的属性匹配,因为
GetProperties()返回的属性顺序和定义一致,且同类型的属性元数据完全相同,所以prop.SetValue(object2, val)就是直接操作目标对象的对应属性,无需额外判断。 - 如果需要排除某些属性(比如只读属性、特定名称的属性),可以在遍历前加过滤条件,比如:
var props = object1.GetType().GetProperties() .Where(p => p.CanWrite); // 只处理可写属性 foreach (var prop in props) { // 逻辑同上 }
更简洁的方式(用库简化)
如果你不想自己写反射逻辑,可以用AutoMapper这类对象映射库,只需要配置一次规则就能自动完成非空属性的赋值:
// 初始化配置(全局一次即可) var config = new MapperConfiguration(cfg => { cfg.CreateMap<YourObjectType, YourObjectType>() .ForAllMembers(opt => opt.Condition((src, dest, srcVal) => srcVal != null)); }); IMapper mapper = config.CreateMapper(); // 执行赋值 mapper.Map(object1, object2);
内容的提问来源于stack exchange,提问作者Cef
相关产品推荐
相关产品推荐

