我正在尝试使用此处找到的功能: DataTable to List<object>
public static IList<T> ConvertTo<T>(DataTable table)
{
if (table == null)
return null;
List<DataRow> rows = new List<DataRow>();
foreach (DataRow row in table.Rows)
rows.Add(row);
return ConvertTo<T>(rows);
}
return语句给了我一个例外说明:
The best overloaded method match for 'Utilities.Utility.ConvertTo<T>(System.Data.DataTable)' has some invalid arguments
有人可以帮我解决这个错误吗?
答案 0 :(得分:1)
不要这样做使用Marc的惊人功能(https://stackoverflow.com/a/545429/215752)我的意思是真的......这正是你想要的......对吗?
你需要另一个功能
public static IList<T> ConvertTo<T>(IList<DataRow> rows)
{
IList<T> list = null;
if (rows != null)
{
list = new List<T>();
foreach (DataRow row in rows)
{
T item = CreateItem<T>(row);
list.Add(item);
}
}
return list;
}
您链接的问题中有一个链接。我建议在那里寻找更多信息:
在那里你会找到我希望编译的所有代码。但我不会保证可靠性或合理使用它。
答案 1 :(得分:1)
首先,您要返回T
而不是IList<T>
。其次,您期望将DataRow
转换为未知T
,特别是如果某行有多列?
尝试这样的事情
public static IList<IList<T>> ConvertTo<T>(DataTable table)
{
if (table == null)
return null;
List<IList<T>> rows = new List<IList<T>>();
foreach (DataRow row in table.Rows) {
rows.Add(row.ItemArray.Cast<T>().ToArray());
}
return rows;
}
更新:
自定义对象就是这样的
public class Employee
{
public int ID { get; set; }
public string Name { get; set; }
public decimal Salary { get; set; }
}
但是,在这种情况下,通用接口没有用,因为您必须为该特定类编码
public static IList<Employee> GetEmployees(DataTable table)
{
var employees = new List<Employee>();
if (table != null) {
foreach (DataRow row in table.Rows) {
var emp = new Employee();
emp.ID = (int)row["ID"];
emp.Name = (string)row["Name"];
emp.Salary = (decimal)row["Salary"];
employees.Add(emp);
}
}
return employees;
}
此代码对于不同的表必须不同,并且不能是通用的。至少不使用Reflection并假设属性与表列具有相同的名称。
不使用某些棘手的Reflection
代码或其他魔术技巧的解决方案是定义这样的界面
public interface IDataObject
{
void FillFromRow(DataRow row);
}
然后您声明Employee
或任何其他类似的数据类
public class Employee : IDataObject
{
public int ID { get; set; }
public string Name { get; set; }
public decimal Salary { get; set; }
public void FillFromRow(DataRow row)
{
ID = (int)row["ID"];
Name = (string)row["Name"];
Salary = (decimal)row["Salary"];
}
}
现在你可以再次使用泛型
public static IList<T> GetItems<T>(DataTable table)
where T : IDataObject, new()
{
var items = new List<T>();
if (table != null) {
foreach (DataRow row in table.Rows) {
T item = new T();
item.FillFromRow(row);
items.Add(item);
}
}
return items;
}