C#如何正确获取类的属性的属性并修改其值?
解决获取并修改类属性的子属性问题
我完全懂你踩的这个坑——你现在第二个foreach循环遍历的是PropertyInfo这个类本身的属性(比如MemberType、ReflectedType这些),而不是从test实例里拿到的属性值的类型属性。咱们调整下代码,就能实现你想要的功能:
核心思路
- 先从
test实例中拿到每个属性的实际值,别停留在PropertyInfo对象本身 - 针对这个属性值,再去获取它的类型的子属性
- 根据需求修改这些子属性的值(比如字符串截断)
完整代码示例
foreach (var parentProp in test.GetType().GetProperties()) { // 获取test实例中当前属性的实际值 var parentPropValue = parentProp.GetValue(test); if (parentPropValue == null) { continue; // 跳过值为null的属性,避免后续空引用异常 } // 遍历这个属性值的类型的所有子属性 foreach (var childProp in parentPropValue.GetType().GetProperties()) { // 举个例子:如果子属性是字符串类型,将其截断到10个字符 if (childProp.PropertyType == typeof(string) && childProp.CanWrite) { var currentChildValue = childProp.GetValue(parentPropValue) as string; if (!string.IsNullOrEmpty(currentChildValue) && currentChildValue.Length > 10) { var truncatedValue = currentChildValue.Substring(0, 10); childProp.SetValue(parentPropValue, truncatedValue); } } // 你可以根据需求添加其他类型的处理逻辑,比如数字取整、日期格式化等 } // 注意:如果父属性是值类型(比如int、自定义结构体),修改子属性后需要把值同步回test实例 if (parentProp.PropertyType.IsValueType && parentProp.CanWrite) { parentProp.SetValue(test, parentPropValue); } }
关键注意事项
- 一定要检查
CanWrite:确保子属性是可写的,否则调用SetValue会抛出异常 - 处理null值:属性值可能为null,提前判断可以避免空引用错误
- 值类型特殊处理:如果父属性是值类型(比如自定义结构体),修改子属性后需要把修改后的父属性值重新赋值回
test实例,因为值类型是按副本传递的
内容的提问来源于stack exchange,提问作者user9248102
相关产品推荐
相关产品推荐

