public static DataTable CopyToDataTable<T>(this IEnumerable<T> array)
{
var ret = new DataTable();
foreach (PropertyDescriptor dp in TypeDescriptor.GetProperties(typeof(T)))
ret.Columns.Add(dp.Name, dp.PropertyType);
foreach (T item in array)
{
var Row = ret.NewRow();
foreach (PropertyDescriptor dp in TypeDescriptor.GetProperties(typeof(T)))
Row[dp.Name] = dp.GetValue(item);
ret.Rows.Add(Row);
}
return ret;
}
这个我早看过了,会出现异常的……
@夜风冷: 這個 怎麼會呢?其實 這個 就是對IEnumerable<T>的一個擴展,利用反射,生成table,先生成table結構,然後,寫入數據。返回datatale,就是這個思路哦。
@無限遐想:我实际写在程序里了,会出现异常的
@夜风冷: 什麽異常呢?其實,就是 通過反射,生成 table哦,然後 就把數據放到datatable里,自己寫 都比較簡單的哦。
@夜风冷: 代碼如下測試:
建立操作類,擴展類
:
public static class DoPersons {
public static DataTable CopyToDataTable<T>(this IEnumerable<T> array)
{
var ret = new DataTable();
foreach (PropertyDescriptor dp in TypeDescriptor.GetProperties(typeof(T)))
ret.Columns.Add(dp.Name, dp.PropertyType);
foreach (T item in array)
{
var Row = ret.NewRow();
foreach (PropertyDescriptor dp in TypeDescriptor.GetProperties(typeof(T)))
Row[dp.Name] = dp.GetValue(item);
ret.Rows.Add(Row);
}
return ret;
}
2.定義類:
public class Person {
public string Name { set; get; }
public int Age { set; get; }
}
3.在程序中調用
static void Main(string[] args)
{
List<Person> lst = new List<Person>();
for (int i = 0; i < 10; i++)
{
lst.Add(new Person { Age=i, Name="gsw"+i.ToString() });
}
DataTable dt = lst.CopyToDataTable<Person>();
}
反射机制实现,把所有的Linq集合迭代装入Datatable中即可!
通过.CopyToDataTable()
MSDN参考:http://msdn.microsoft.com/en-us/library/bb386921.aspx
CopyToDataTable()在哪儿
@夜风冷: 要添加System.Data.DataSetExtensions (in System.Data.DataSetExtensions.dll)的引用,并在代码中添加命名空间System.Data
@dudu: 不行哎