我遇到了以下问题:
我通常使用下面的函数将自定义数据传输到DataTable,但在这种情况下,输入数据是由列表组成的类。我只需要在DataTable中写入每行每个列表的第一个元素。你能帮我调整一下这个功能吗?
public List<int> xID { get; set; }
public List<string> xName { get; set; }
public List<string> xType { get; set; }
public List<string> xSource { get; set; }
public List<int> xmdID { get; set; }
public List<string> xMDName { get; set; }
public List<string> xUser { get; set; }
public static DataTable ListToDataTable<T>(IEnumerable<T> list)
{
Type type = typeof(T);
var properties = type.GetProperties();
DataTable dataTable = new DataTable();
foreach (PropertyInfo info in properties)
{
dataTable.Columns.Add(new DataColumn(info.Name, info.PropertyType));
}
foreach (T entity in list)
{
object[] values = new object[properties.Length];
for (int i = 0; i < properties.Length; i++)
{
values[i] = properties[i].GetValue(entity);
}
dataTable.Rows.Add(values);
}
return dataTable;
}
基于Carra回答我尝试了下面的代码,但是它没有识别pType类型(找不到类型或命名空间名称'pType'(你是否缺少using指令或汇编引用?)
var v = properties[i].GetValue(entity);
Type pType = properties[i].PropertyType;
if (pType.IsGenericType && pType.GetGenericTypeDefinition() == typeof(Nullable<>))
pType = Nullable.GetUnderlyingType(pType);
if (pType.IsEnum)
pType = Enum.GetUnderlyingType(pType);
if (v.GetType().GetGenericTypeDefinition() == typeof(List<>))
{
values[i] = (v as List<pType>).First();
}
更新
我想这不是最好的解决方案,因为它不接受任何List类型,但它是我能做的最好的:
public static DataTable ListToDataTable<T>(IEnumerable<T> list)
{
Type type = typeof(T);
var properties = type.GetProperties();
DataTable dataTable = new DataTable();
foreach (PropertyInfo info in properties)
{
Type propertyType = info.PropertyType;
if (propertyType.IsGenericType | propertyType.GetGenericTypeDefinition() == typeof(Nullable<>) | propertyType.IsEnum)
propertyType = propertyType.GetGenericArguments()[0];
dataTable.Columns.Add(new DataColumn(info.Name, propertyType));
}
foreach (T entity in list)
{
object[] values = new object[properties.Length];
for (int i = 0; i < properties.Length; i++)
{
var v = properties[i].GetValue(entity);
Type pType = v.GetType().GetGenericArguments().FirstOrDefault();
if (v.GetType().GetGenericTypeDefinition() == typeof(List<>))
{
if(pType == typeof(int))
values[i] = (v as List<int>).First();
else if(pType == typeof(string))
values[i] = (v as List<string>).First();
}
else
{
values[i] = v;
}
}
dataTable.Rows.Add(values);
}
return dataTable;
}
答案 0 :(得分:0)
你需要这样的东西:
foreach (PropertyInfo info in properties)
{
if(info.PropertyType == typeof(IEnumerable))
{
dataTable.Columns.Add(new DataColumn(info.Name, info.Cast<object>().First().GetType());
}
else
{
dataTable.Columns.Add(new DataColumn(info.Name, info.PropertyType));
}
}
foreach (T entity in list)
{
object[] values = new object[properties.Length];
for (int i = 0; i < properties.Length; i++)
{
var v = properties[i].GetValue(entity);
if(v is IEnumerable)
{
values[i] = (v.Cast<object>().First()).First();
}
else
{
values[i] = v;
}
}
dataTable.Rows.Add(values);
}
答案 1 :(得分:0)
这对我有用。我得到了here并对其进行了一些修改。
public static DataTable ToDataTable<T>(this System.Collections.Generic.List<T> collection, string _sTableName) {
var table = new DataTable(_sTableName);
var type = typeof(T);
var properties = type.GetProperties();
//Create the columns in the DataTable
foreach (var property in properties) {
if (property.PropertyType == typeof(int?)) {
table.Columns.Add(property.Name, typeof(int));
} else if (property.PropertyType == typeof(decimal?)) {
table.Columns.Add(property.Name, typeof(decimal));
} else if (property.PropertyType == typeof(double?)) {
table.Columns.Add(property.Name, typeof(double));
} else if (property.PropertyType == typeof(DateTime?)) {
table.Columns.Add(property.Name, typeof(DateTime));
} else if (property.PropertyType == typeof(Guid?)) {
table.Columns.Add(property.Name, typeof(Guid));
} else if (property.PropertyType == typeof(bool?)) {
table.Columns.Add(property.Name, typeof(bool));
} else {
table.Columns.Add(property.Name, property.PropertyType);
}
}
//Populate the table
foreach (var item in collection) {
var row = table.NewRow();
row.BeginEdit();
foreach (var property in properties) {
row[property.Name] = property.GetValue(item, null) ?? DBNull.Value;
}
row.EndEdit();
table.Rows.Add(row);
}
return table;
}