使用泛型时出现无效参数错误
本文关键字:无效 参数 错误 泛型 | 更新日期: 2023-09-27 18:28:08
我正在尝试使用这里的函数:要列出的数据表<对象>
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);
}
返回语句给了我一个例外,说明:
The best overloaded method match for 'Utilities.Utility.ConvertTo<T>(System.Data.DataTable)' has some invalid arguments
有人能帮我纠正这个错误吗??
不要那样做——使用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;
}
你链接的问题中有一个链接。我建议你在那里查找更多信息:
http://lozanotek.com/blog/archive/2007/05/09/Converting_Custom_Collections_To_and_From_DataTable.aspx
在那里你会找到所有的代码,我希望这些代码能够编译。然而,我不会保证使用它的可靠性或合理性。
首先,返回的是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
代码或其他魔术的解决方案是定义一个类似的接口
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;
}