从List获取第一个值到DataRow for Excel

时间:2016-09-01 15:07:20

标签: c# datagridview

使用C#我将对象的属性值提取到DataGrid中,这对于简单的数据类型很有效。但是当有一个List我想只提取第一个值时,附加一个省略号并出现一个工具提示,通知用户点击查看整个列表。

这是我到目前为止的代码:

    public static DataTable ConvertListToDataTable<T>(List<T> list)
    {
        DataTable dt = new DataTable();

        foreach (PropertyInfo info in typeof(T).GetProperties())
        {
            dt.Columns.Add(new DataColumn(info.Name, Nullable.GetUnderlyingType(info.PropertyType) ?? info.PropertyType));
        }
        foreach (T t in list)
        {
            DataRow row = dt.NewRow();

            foreach (PropertyInfo info in typeof(T).GetProperties())
            {
                if (info.PropertyType.GetInterfaces().Contains(typeof(System.Collections.ICollection)))
                {
                    if(!info.GetValue(t,null).Equals(null))
                    {
                        row[info.Name] = String.Concat(info.GetValue(t, new object[]{ 0 }).ToString(), "...");
                    }
                }
                else
                {
                    row[info.Name] = info.GetValue(t, null) ?? DBNull.Value;
                }
            }
            dt.Rows.Add(row);
        }
        return dt;
    }

简单的数据类型提取没有任何问题。

确定哪些属性有列表后,我正在努力提取列表的第一个值。提供的代码抛出异常:

info.GetValue(t, new object[]{ 1 })' threw an exception of type     'System.Reflection.TargetParameterCountException'
base: {System.Reflection.TargetParameterCountException: Parameter count mismatch.
   at System.Reflection.RuntimeMethodInfo.InvokeArgumentsCheck(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at System.Reflection.RuntimePropertyInfo.GetValue(Object obj, BindingFlags invokeAttr, Binder binder, Object[] index, CultureInfo culture)
   at System.Reflection.RuntimePropertyInfo.GetValue(Object obj, Object[] index)}

0 个答案:

没有答案