在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<T>
做
【参考方案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#中遍历通用类型列表的主要内容,如果未能解决你的问题,请参考以下文章
TypeScript:相当于 C# 的用于扩展类的通用类型约束?
在 c# 中拥有一个采用任何类型的可索引列表的方法的最有效方法是啥