使用泛型无效的参数错误

时间:2012-03-16 18:37:05

标签: c#

我正在尝试使用此处找到的功能: 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

有人可以帮我解决这个错误吗?

2 个答案:

答案 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;
    }

您链接的问题中有一个链接。我建议在那里寻找更多信息:

http://lozanotek.com/blog/archive/2007/05/09/Converting_Custom_Collections_To_and_From_DataTable.aspx

在那里你会找到我希望编译的所有代码。但我不会保证可靠性或合理使用它。

答案 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;
}