在c#中遍历通用类型列表

Posted

技术标签:

【中文标题】在c#中遍历通用类型列表【英文标题】:Iterate through Generic Typed List in c# 【发布时间】:2021-01-07 04:52:30 【问题描述】:

我正在尝试遍历泛型类型对象列表,我能够获取对象的属性,但无法从对象的每个实例的属性中获取值。下面是我的代码的样子:我想创建一个函数来转换任何传递给它的列表并将其转换为 DataTable。

--数据对象

public class StudentDo

     public int Id get;set
     public string Name get;set

--通用数据访问对象

public DataTable ConvertListToDataTable(List<T> list, string tableName = "")

     var type = typeof(T);
     var properties = type.GetProperties().ToList();
     DataTable dt = new DataTable(tableName);
     properties.ForEach(x =>
     
         dt.Columns.Add(x.Name);
     );

     // i don't know how shall i pull data from each instance of List<T>.
     return dt;

【问题讨论】:

这似乎不是迭代通用列表的问题。您的问题似乎是关于如何使用反射读取属性值。 只是好奇为什么要将结构良好的类型集合转换为DataTable?在大多数情况下,您想用DataTable 做的所有事情都可以用List&lt;T&gt; 【参考方案1】:

遍历列表并使用反射插入每一列 -

public static DataTable ConvertListToDataTable<T>(List<T> list, string tableName = "")
        
            var type = typeof(T);
            var properties = type.GetProperties().ToList();
            DataTable dt = new DataTable(tableName);
            properties.ForEach(x =>
            
                dt.Columns.Add(x.Name);
            );
            foreach (var item in list)
            
                var dataRow = dt.NewRow();
                properties.ForEach(x =>
                
                    dataRow[x.Name] = x.GetValue(item, null);
                );
                dt.Rows.Add(dataRow);
            
            return dt;
        

【讨论】:

这很好用,更进一步,有没有办法只包含具有值的类的那些属性,并在生成数据表时避免其余属性。 @Abbas,你的意思是跳过空值? 我的意思是跳过将属性加载到拥有 NULL 或 Empty 值的数据表中【参考方案2】:

这是我用的:

    public DataTable ToDataTable<T>(IList<T> data)
    
        PropertyDescriptorCollection properties =
            TypeDescriptor.GetProperties(typeof(T));
        DataTable table = new DataTable();
        foreach (PropertyDescriptor prop in properties)
            table.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType);
        foreach (T item in data)
        
            DataRow row = table.NewRow();
            foreach (PropertyDescriptor prop in properties)
                row[prop.Name] = prop.GetValue(item) ?? DBNull.Value;
            table.Rows.Add(row);
        
        return table;
    

【讨论】:

以上是关于在c#中遍历通用类型列表的主要内容,如果未能解决你的问题,请参考以下文章

C#从反射类型实例化通用列表[重复]

TypeScript:相当于 C# 的用于扩展类的通用类型约束?

在 c# 中拥有一个采用任何类型的可索引列表的方法的最有效方法是啥

C# 使用 System.Type 作为通用参数

在 C# 中:如何声明一个类型为键的通用字典,该类型的 IEnumerable<> 作为值?

(75)C#里为什么需要通用类型容器