使用泛型时出现无效参数错误

本文关键字:无效 参数 错误 泛型 | 更新日期: 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;
}