我有以下功能
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));
发生了什么错误?
请帮忙
答案 0 :(得分:0)
因为string
的一个公共属性是索引器,并且您将null
作为索引值传递。所以你最终会这样做:string[null]
最终会出现异常。
我还没有验证这个,因为我现在没有VS可用,所以我可能错了,但我很确定这是问题。
更新:此问题解答了如何检测索引属性:C# Reflection Indexed Properties
答案 1 :(得分:0)
这是交易。使用反射时,索引运算符实际上被视为属性,因此参数计数不匹配。
如果您闯入代码并检查GetProperties()实际枚举的属性,您将看到“Chars”属性。这是String的索引运算符。由于您没有提供索引,因此您收到参数计数不匹配错误。
本质上,我假设string没有你想要放在数据表中的任何属性,而是字符串实例是你要放在数据表中的。
您可以创建一个模型来存储字符串,并将字符串作为模型的属性,然后字符串将与您当前的代码一起存储。否则,您需要重新考虑基本类型的表生成算法。
我希望这会有所帮助:)