gpt4 book ai didi

c# - 如何使用反射将 DataTable 转换为 List

转载 作者:太空狗 更新时间:2023-10-29 21:18:27 27 4
gpt4 key购买 nike

我有一个类的通用列表,我使用 Reflection 和扩展方法自动将它转换为 DataTable。现在我想反向进行。我想转换 DataTable 到 List.Better 说我想要帮助编写一个方法,该方法需要 DataTableType 并根据列自动查找该类型(类)的属性为该类型(类)的对象命名并赋值。像这样的 psodu 代码:

private List<T> ConvertToList<T>(DataTable dt)
{
List<string> AllColumns = // Get All Column Names of a DataTable
for(int i=0;i<dt.Rows.Count;i++)
{
foreach(var item in AllColumns )
{
//Get Property According To **ITEM**
//Get Data Of Rows[i][item] and assign it to T.property
}
}
}

我该怎么做?


编辑 1)

我这样使用@Cuong Le 的回答:

var properties = typeof(CustomType).GetProperties().ToList();
List<CustomType> list = ConvertToList<CustomType>(dt, properties);

和:

private List<T> ConvertToList<T>(DataTable dt,List<PropertyInfo> fields) where T : class
{
return dt.AsEnumerable().Select(Convert<T>(fields)).ToList(); <------
}

private T Convert<T>(DataRow row,List<PropertyInfo> fields) where T : class
{
var properties = typeof(T).GetProperties().ToList();

var objT = Activator.CreateInstance<T>();
foreach (var pro in properties)
{
pro.SetValue(objT, row[pro.Name],null);
}

return objT;
}

但是在一行中我在它前面放了一个箭头我得到了这两个错误:

No overload for method 'Convert' takes 1 arguments

The type arguments for method 'System.Data.EnumerableRowCollectionExtensions.Select(System.Data.EnumerableRowCollection, System.Func)' cannot be inferred from the usage. Try specifying the type arguments explicitly.

我该如何解决这个问题?

最佳答案

使用AsEnumerable()方法支持LINQ:

    private List<T> ConvertToList<T>(DataTable dt)
{
var columnNames = dt.Columns.Cast<DataColumn>()
.Select(c => c.ColumnName)
.ToList();

var properties = typeof(T).GetProperties();

return dt.AsEnumerable().Select(row =>
{
var objT = Activator.CreateInstance<T>();

foreach (var pro in properties)
{
if (columnNames.Contains(pro.Name))
pro.SetValue(objT, row[pro.Name]);
}

return objT;
}).ToList();

}

GetProperties searches for the properties of the current Type, using the specified binding constraints.

链接在这里:http://msdn.microsoft.com/en-us/library/kyaxdd3x.aspx

关于c# - 如何使用反射将 DataTable 转换为 List<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12662318/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com