C#参数计数不匹配将List转换为DataTable

时间:2017-10-20 18:44:38

标签: c# list datatable

我在代码行的标题中提到了异常

values[i] = Props[i].GetValue(item, null); 

我不确定是什么导致这种情况。任何帮助,将不胜感激。

public static DataTable ToDataTable<T>(List<T> items)
{
    DataTable dataTable = new DataTable(typeof(T).Name);


    PropertyInfo[] Props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);
    foreach (PropertyInfo prop in Props)
    {

        var type = (prop.PropertyType.IsGenericType && prop.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>) ? Nullable.GetUnderlyingType(prop.PropertyType) : prop.PropertyType);

        dataTable.Columns.Add(prop.Name, type);
    }
    foreach (T item in items)
    {
        var values = new object[Props.Length];
        for (int i = 0; i < Props.Length; i++)
        {
            values[i] = Props[i].GetValue(item, null);
        }
        dataTable.Rows.Add(values);
    }

    return dataTable;
}

2 个答案:

答案 0 :(得分:2)

如果此行抛出异常

values[i] = Props[i].GetValue(item, null); 

...那么这意味着你有一个需要参数的属性。在c#中,获取参数的唯一属性类型是indexer。我的猜测是你应该从循环中排除索引器。

请参阅this question,告诉您如何检测索引器。

您可以通过更改一行来解决此问题。改变这个......

PropertyInfo[] Props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);

......对此......

PropertyInfo[] Props = typeof(T)
    .GetProperties(BindingFlags.Public | BindingFlags.Instance)
    .Where(p => p.GetIndexParameters == null))
    .ToArray();

答案 1 :(得分:0)

问题实际上是我传入方法的数据(字符串列表)。似乎GetValue()方法正在寻找一个对象。我创建了一个带有字符串属性的类,并更改了我传递给类的列表类型,并将类中的属性设置为我传递给foreach循环中列表的字符串。对不起,如果只是试图解释我是如何解决这个问题没有意义,但问题可能已经解决了很多方面。谢谢,全部。