转换泛型列表或string[]数组为数据表

本文关键字:string 数组 数据表 泛型 列表 转换 | 更新日期: 2023-09-27 17:49:40

我有下面的函数

public static DataTable ToTable<T>(this IEnumerable<T> listItem)
{
            //Return null if the list is empty
            if (listItem == null || listItem.Count() == 0) return null;
            //Gets the type of the object
            var listType = listItem.First().GetType();
            //Initialize a new datatable
            var dataTable = new DataTable(listType.Name);
            //Create the datatable column names and types
            listType.GetProperties().ToList().ForEach(col => dataTable.Columns.Add(col.Name, col.PropertyType));
            //Get the datatable column names
            var dataTableColumnNames = dataTable.GetDatatableColumnNames();
            listItem.ToList().ForEach(item =>
            {
                //create a new datarow
                var dataRow = dataTable.NewRow();
                dataTableColumnNames
                .Where(propName => listType.GetProperty(propName) != null)
                .ToList()
                .ForEach(columnName => 
//Exception happens here in the next line
     dataRow[columnName] = listType.GetProperty(columnName).GetValue(item, null));     
                //Add the row to the data table
                dataTable.Rows.Add(dataRow);
            });
            //Commit the changes to the datatable
            dataTable.AcceptChanges();
            return dataTable;
        }

它适用于字典对象和通用列表作为List<MyClass> ..但不是List<string>string[] .

对于那些我得到一个异常作为参数计数不匹配。

错误出现在

dataRow[columnName] = listType.GetProperty(columnName).GetValue(item, null));

发生的错误是什么?

请帮

转换泛型列表<string>或string[]数组为数据表

事情是这样的。在使用反射时,索引操作符实际上被认为是一个属性,因此参数计数不匹配。

如果您进入代码并检查GetProperties()实际枚举的属性,您将看到"Chars"属性。这是String的下标操作符。由于您没有提供索引,因此会得到Parameter Count Mismatch错误。

本质上,我假设字符串没有任何你想要放在数据表中的属性,而是字符串实例是你想要放在数据表中的。

您可以创建一个模型来存储字符串,将字符串作为模型的属性,然后该字符串将与您当前的代码一起存储。否则,您将需要重新考虑原始类型的表生成算法。

我希望这对你有帮助。

因为string的一个公共属性是索引器,您传递null作为索引值。所以你有效地结束这样做:string[null],最终在一个异常。

我还没有验证这一点,因为我现在没有VS可用,所以我可能是错的,但我很确定这就是问题所在。

Update:这个问题回答了如何检测索引属性: