如何获取DataGrid的ItemSource对应类的所有属性
解决方案
你当前的代码存在问题:dataSource.GetType().GetProperties() 获取的是集合类型本身的属性(比如ObservableCollection<T>的Count、Items等),而非集合中元素对应类的属性。要获取目标类的属性,需要先拿到元素的类型,再反射获取其属性。
以下是修正后的通用方法:
private void DataGrid_PreviewKeyDown(object sender, KeyEventArgs e) { DataGrid grid = sender as DataGrid; var dataSource = grid?.ItemsSource; if (dataSource == null) return; Type itemType = null; // 情况1:集合中有元素,直接取第一个元素的类型 var firstItem = dataSource.Cast<object>().FirstOrDefault(); if (firstItem != null) { itemType = firstItem.GetType(); } // 情况2:集合为空,通过反射获取泛型集合的元素类型 else { var enumerableType = dataSource.GetType().GetInterface(typeof(IEnumerable<>).FullName); if (enumerableType != null) { itemType = enumerableType.GetGenericArguments()[0]; } } if (itemType != null) { // 获取元素类的所有公共实例属性 foreach (var prop in itemType.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance)) { // 这里可以处理属性,例如输出属性名称、类型等 // Console.WriteLine($"属性名:{prop.Name},类型:{prop.PropertyType.Name}"); } } }
关键细节
- 优先通过集合中的元素获取类型:如果集合不为空,直接取第一个元素的
GetType(),这种方式更直观可靠。 - 空集合的兼容处理:当集合没有元素时,通过反射提取
IEnumerable<T>接口的泛型参数,以此得到元素的类型。 - 明确属性筛选规则:通过
BindingFlags指定只获取公共实例属性,避免拿到静态属性或非公共属性。
内容的提问来源于stack exchange,提问作者Gokhan
相关产品推荐
相关产品推荐

