如何在C#中利用反射获取List中嵌套模型的属性值?
解决C#反射嵌套模型属性取值问题
你当前的问题出在li.GetValue(item, null)这行代码:这里的item是PropertyInfo类型(描述属性的元数据),不是具体的对象实例,所以没法直接用它来获取子属性的值。
正确的做法是先从当前遍历的根对象(Data[i])中拿到嵌套属性的实例,再用这个实例去取子属性的值,具体修改如下:
在else if (GetTypeOfProp(item) == 2)的分支里,补充获取嵌套对象的逻辑并修正取值代码:
else if (GetTypeOfProp(item) == 2) { int OldCol = Col; // 先从当前根对象Data[i]中取出嵌套属性的实例 var nestedObj = item.GetValue(Data[i], null); foreach (var li in item.PropertyType.GetProperties()) { worksheet.Range[GetCol(Col) + (Row + 1)].Text = li.Name; // 用嵌套对象实例获取子属性的值,处理null避免空引用异常 var value = nestedObj != null ? li.GetValue(nestedObj, null) : null; // 可选:将值转为字符串写入单元格 // worksheet.Range[GetCol(Col) + (Row + 1)].Text = (value ?? "").ToString(); Col = Col + 1; MaxRecOfRow = 1; } worksheet.Range[$"{GetCol(OldCol) + Row}:{GetCol(Col - 1) + Row}"].Merge(); worksheet.Range[$"{GetCol(OldCol) + Row}:{GetCol(Col - 1) + Row}"].Text = item.Name; }
核心逻辑说明
item.GetValue(Data[i], null):从当前根模型实例Data[i]中提取嵌套属性的具体对象(比如根模型有Address属性,这里就拿到Data[i].Address的实例)。- 必须判断
nestedObj是否为null,防止后续调用li.GetValue时抛出空引用异常。
内容的提问来源于stack exchange,提问作者mohammad asadi
相关产品推荐
相关产品推荐

