好久没有写这样的代码了,由于DX控件的需要自行封装一个集合与DataTable转的方法。
结果在dt.NewRow()
的时候居然没有列名?前面不是定义列明了吗?怎么回事呢?
private DataTable ListToDataTable<T>(IList<T> list) where T : class, new()
{
if (list == null || list.Count == 0)
{
return null;
}
DataTable dt = new DataTable(typeof(T).Name);
//列
dt.Columns.AddRange(typeof(T).GetProperties().Select(p => new DataColumn(p.Name, p.DeclaringType)).ToArray());
//行
foreach (var item in list)
{
//添加空白行
var row = dt.NewRow();
foreach (var p in typeof(T).GetProperties())
{
row[p.Name] = p.GetValue(item, null) ?? DBNull.Value;
}
dt.Rows.Add(row);
}
return dt;
}
你打个断点不就知道了?
//列
dt.Columns.AddRange(typeof(T).GetProperties().Select(p => new DataColumn(p.Name, p.DeclaringType)).ToArray());
执行后没有问题,列名不是都添加上了吗?
而且你这添加 DataColumn 的代码是错的,
p.DeclaringType 并不能获取到属性的类型
是因为Type的问题,使用p.PropertyType
即可。
p.DeclaringType--》T的类型