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

如何获取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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 12:07:12