none
关于使用List<T>生成DataTable并填充 RRS feed

  • 问题

  • public DataTable listToDataTable<T>(List <T> list)
            {
                DataTable dt = new DataTable();
                for (int i = 0; i < list[0].GetType().GetProperties().Count(); i++)
                {
                  dt.Columns .Add (list [0].GetType ().GetProperties ()[i].Name ,list[0].GetType ().GetProperties ()[i].GetType () );                                                                               //这句有问题,老得不到属性的类型
                
                }
                for (int j = 0; j < list.Count; j++)
                {
                    dt.Rows.Add();
                    for (int i = 0; i < list[0].GetType().GetProperties().Count(); i++)
                    {
                        object val=list[j].GetType().GetProperties()[i].GetValue(list[j], null);

                        dt.Rows[j][list[0].GetType().GetProperties()[i].Name] = val;
                    }
                }
                return dt;
            }
    2014年7月15日 3:21

答案

  • 你好。

    把出错的那行代码GetType()方法改成PropertyType属性即可。

    dt.Columns.Add(
        list[0].GetType().GetProperties()[i].Name,
        list[0].GetType().GetProperties()[i].PropertyType);



    • 已编辑 shao.meng 2014年7月15日 3:49 code format
    • 已标记为答案 yaoly 2014年7月15日 4:37
    2014年7月15日 3:48

全部回复

  • 你好。

    把出错的那行代码GetType()方法改成PropertyType属性即可。

    dt.Columns.Add(
        list[0].GetType().GetProperties()[i].Name,
        list[0].GetType().GetProperties()[i].PropertyType);



    • 已编辑 shao.meng 2014年7月15日 3:49 code format
    • 已标记为答案 yaoly 2014年7月15日 4:37
    2014年7月15日 3:48
  • 还是跑不了,出现 “DataSet 不支持 System.Nullable<>。” ,我有点怀疑这个方法是不支持 “int?" ,因为这个类中有int?型属性
    2014年7月15日 3:59
  • 是的,问题就在于int?。这个问题解决思路是这样的:找到Nullable类型的字段,然后转换成对应的值类型。

    这样第一个for循环的代码可以修改为:

    for (int i = 0; i < list[0].GetType().GetProperties().Count(); i++)
    {
        var property = list[0].GetType().GetProperties()[i];
        Type columnType = property.PropertyType;
        if (property.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>))
            columnType = property.PropertyType.GetGenericArguments()[0];
        dt.Columns.Add(property.Name, columnType);
    }
    这样就可以避免Nullable类型了。

    2014年7月15日 4:41