获取列表内对象属性求助:动态表单开发遇List<>属性获取异常
解决List<>类型属性反射只返回Capacity/Count的问题
嘿,我完全懂你碰到的这个坑——当你用反射处理List<T>类型的属性时,只会拿到List本身的Capacity和Count,而不是列表里对象的真实属性,对吧?这是因为默认的GetType().GetProperties()只会抓取当前对象(也就是List实例)的公共属性,不会自动帮你深入到它的元素类型里。
下面是具体的解决思路和代码示例:
1. 识别List<>类型的属性
首先要判断当前遍历的属性是不是泛型List类型,我们可以通过检查它的泛型定义来确认:
bool isListType = prop.PropertyType.IsGenericType && prop.PropertyType.GetGenericTypeDefinition() == typeof(List<>);
2. 获取List元素的类型和属性
如果确认是List类型,就可以提取它的元素类型,再获取元素的公共属性:
dynamic ObjectToPopulate; PropertyInfo[] PopulatedObjectProperties = ObjectToPopulate.GetType().GetProperties(); foreach (var prop in PopulatedObjectProperties) { bool isListType = prop.PropertyType.IsGenericType && prop.PropertyType.GetGenericTypeDefinition() == typeof(List<>); if (isListType) { // 获取List的元素类型 Type elementType = prop.PropertyType.GetGenericArguments()[0]; // 获取元素类型的所有公共属性 PropertyInfo[] elementProperties = elementType.GetProperties(); // 用元素属性构建DataGridView列 foreach (var elemProp in elementProperties) { dataGridView.Columns.Add(new DataGridViewTextBoxColumn { Name = elemProp.Name, HeaderText = elemProp.Name, DataPropertyName = elemProp.Name }); } // 取出List实例数据,绑定到DataGridView var listData = prop.GetValue(ObjectToPopulate) as IEnumerable; if (listData != null) { dataGridView.DataSource = listData.Cast<object>().ToList(); } } else { // 处理普通非List类型的属性逻辑 // 示例:添加普通属性列 dataGridView.Columns.Add(new DataGridViewTextBoxColumn { Name = prop.Name, HeaderText = prop.Name, DataPropertyName = prop.Name }); // 填充单值数据(根据你的业务逻辑调整) } }
额外提示
如果你的场景中还可能遇到其他泛型集合(比如ICollection<T>、IList<T>),可以扩展判断条件,兼容更多集合类型:
if (typeof(IEnumerable).IsAssignableFrom(prop.PropertyType) && prop.PropertyType != typeof(string)) { Type elementType = prop.PropertyType.IsGenericType ? prop.PropertyType.GetGenericArguments()[0] : typeof(object); // 非泛型集合默认按object处理 // ...后续元素属性处理逻辑同上 }
这样就能正确获取到列表内对象的属性,用来动态生成DataGridView的列和填充数据啦。
内容的提问来源于stack exchange,提问作者KnightsOfTheRoun
相关产品推荐
相关产品推荐

