开发者

Problem in converting a generic list<string> or string[] array to datatable

开发者 https://www.devze.com 2023-02-23 14:36 出处:网络
I have the below function public static DataTable ToTable<T>(this IEnumerable<T> listItem)

I have the below function

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

It works great for dictionary object and generic list as List<MyClass> .. but not for List<string> or string[].

For those I am getting an exception as Parameter count mismatch.

The error is coming at

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

What is the mistake that is happening?

Please help


Here's the deal. The index operator is actually considered a property when using reflection, hence parameter count mismatch.

If you break into your code and check the properties that are actually being enumerated by GetProperties(), you'll see the "Chars" property. That's the String's index operator. Since you didn't provide an index, you're getting a Parameter Count Mismatch error.

In essence, I assume string doesn't have any properties you want to put in your data table, but rather the string instance IS what you want to put in the data table.

You could create a model to store the string in, with the string as a property on the model, then the string would be stored with your current code. Otherwise, you will need to rethink your table generation algorithm for primitive types.

I hope this helps :)


Because one of the public properties of string is an indexer and you pass null as the index value. So you effectively end up doing this: string[null] which ends up in an exception.

I haven't verified this as I don't have VS available right now so I might be wrong but I'm pretty sure that's the problem.

Update: This question answers how you detect an indexed property: C# Reflection Indexed Properties

0

精彩评论

暂无评论...
验证码 换一张
取 消