You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#如何正确获取类的属性的属性并修改其值?

解决获取并修改类属性的子属性问题

我完全懂你踩的这个坑——你现在第二个foreach循环遍历的是PropertyInfo这个类本身的属性(比如MemberType、ReflectedType这些),而不是从test实例里拿到的属性值的类型属性。咱们调整下代码,就能实现你想要的功能:

核心思路

  1. 先从test实例中拿到每个属性的实际值,别停留在PropertyInfo对象本身
  2. 针对这个属性值,再去获取它的类型的子属性
  3. 根据需求修改这些子属性的值(比如字符串截断)

完整代码示例

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:45:11