Convert generic List/Enumerable to DataTable?

后端 未结 27 2156
臣服心动
臣服心动 2020-11-21 23:20

I have few methods that returns different Generic Lists.

Exists in .net any class static method or whatever to convert any list into a datatable? The only thing tha

相关标签:
27条回答
  • 2020-11-22 00:05

    Simplest answer could be this one :

    [https://stackoverflow.com/a/60776314/10235747][1]

    0 讨论(0)
  • 2020-11-22 00:06

    try this

    public static DataTable ListToDataTable<T>(IList<T> lst)
    {
    
        currentDT = CreateTable<T>();
    
        Type entType = typeof(T);
    
        PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(entType);
        foreach (T item in lst)
        {
            DataRow row = currentDT.NewRow();
            foreach (PropertyDescriptor prop in properties)
            {
    
                if (prop.PropertyType == typeof(Nullable<decimal>) || prop.PropertyType == typeof(Nullable<int>) || prop.PropertyType == typeof(Nullable<Int64>))
                {
                    if (prop.GetValue(item) == null)
                        row[prop.Name] = 0;
                    else
                        row[prop.Name] = prop.GetValue(item);
                }
                else
                    row[prop.Name] = prop.GetValue(item);                    
    
            }
            currentDT.Rows.Add(row);
        }
    
        return currentDT;
    }
    
    public static DataTable CreateTable<T>()
    {
        Type entType = typeof(T);
        DataTable tbl = new DataTable(DTName);
        PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(entType);
        foreach (PropertyDescriptor prop in properties)
        {
            if (prop.PropertyType == typeof(Nullable<decimal>))
                 tbl.Columns.Add(prop.Name, typeof(decimal));
            else if (prop.PropertyType == typeof(Nullable<int>))
                tbl.Columns.Add(prop.Name, typeof(int));
            else if (prop.PropertyType == typeof(Nullable<Int64>))
                tbl.Columns.Add(prop.Name, typeof(Int64));
            else
                 tbl.Columns.Add(prop.Name, prop.PropertyType);
        }
        return tbl;
    }
    
    0 讨论(0)
  • 2020-11-22 00:07

    This is a simple mix of the solutions. It work with Nullable types.

    public static DataTable ToDataTable<T>(this IList<T> list)
    {
      PropertyDescriptorCollection props = TypeDescriptor.GetProperties(typeof(T));
      DataTable table = new DataTable();
      for (int i = 0; i < props.Count; i++)
      {
        PropertyDescriptor prop = props[i];
        table.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType);
      }
      object[] values = new object[props.Count];
      foreach (T item in list)
      {
        for (int i = 0; i < values.Length; i++)
          values[i] = props[i].GetValue(item) ?? DBNull.Value;
        table.Rows.Add(values);
      }
      return table;
    }
    
    0 讨论(0)
提交回复
热议问题