下面我将详细讲解“C#中DataTable和List互转的示例代码”的完整攻略。
目录
- DataTable转List
1.1 使用ToList扩展方法
1.2 使用反射自动映射 - List转DataTable
2.1 使用数据表生成方式
2.2 使用反射自动映射
1. DataTable转List
1.1 使用ToList扩展方法
public static List<T> DataTableToList<T>(DataTable dataTable) where T : class, new()
{
var list = new List<T>();
foreach (DataRow row in dataTable.Rows)
{
var obj = new T();
foreach (var property in typeof(T).GetProperties())
{
if (dataTable.Columns.Contains(property.Name))
property.SetValue(obj, Convert.ChangeType(row[property.Name], property.PropertyType));
}
list.Add(obj);
}
return list;
}
上述代码中我们定义了一个静态方法DataRowToList
通过遍历DataRow,我们创建新对象T,并将DataRow的每个字段复制到对象T的属性中。为了确保映射的成功,代码中针对DataRow的每个字段均执行了相应的类型转换,包括空值判断、类型转换等。
使用方法:
var dataTable = new DataTable();
dataTable.Columns.Add("Name");
dataTable.Columns.Add("Age");
dataTable.Rows.Add("Tom", 18);
dataTable.Rows.Add("Jerry", 20);
var list = DataTableToList<Student>(dataTable);
上述代码中我们首先创建了一个包含两条记录的DataTable。接着调用我们刚刚定义的静态方法,将DataTable转为List
1.2 使用反射自动映射
public static List<T> DataTableToList<T>(DataTable dataTable) where T : new()
{
var list = new List<T>();
foreach (DataRow row in dataTable.Rows)
{
var obj = new T();
foreach (PropertyInfo property in typeof(T).GetProperties())
{
if (!dataTable.Columns.Contains(property.Name)) continue;
if (row[property.Name] != DBNull.Value)
property.SetValue(obj, row[property.Name]);
}
list.Add(obj);
}
return list;
}
这段代码同样实现了DataTable转List的功能。不同的是,这里使用了反射技术,自动将DataRow的每个字段映射到目标对象的属性中。
这里省略了类型转换的过程,实践中需要根据具体情况添加相关代码逻辑。
使用方法:
var dataTable = new DataTable();
dataTable.Columns.Add("Name");
dataTable.Columns.Add("Age");
dataTable.Rows.Add("Tom", 18);
dataTable.Rows.Add("Jerry", 20);
var list = DataTableToList<Student>(dataTable);
同样是通过静态方法调用,我们实现了DataTable到List的迁移。
2. List转DataTable
2.1 使用数据表生成方式
public static DataTable ListToDataTable<T>(List<T> list)
{
var dataTable = new DataTable();
foreach (var property in typeof(T).GetProperties())
dataTable.Columns.Add(property.Name, Nullable.GetUnderlyingType(property.PropertyType) ?? property.PropertyType);
foreach (var item in list)
{
var dataRow = dataTable.NewRow();
foreach (var property in typeof(T).GetProperties())
dataRow[property.Name] = property.GetValue(item) ?? DBNull.Value;
dataTable.Rows.Add(dataRow);
}
return dataTable;
}
上述代码中我们定义了一个静态方法ListToDataTable
所有属性都被添加到数据表的列中,然后将属性值插入到数据行中。
使用方法:
var list = new List<Student>
{
new Student { Name = "Tom", Age = 18 },
new Student { Name = "Jerry", Age = 20 }
};
var dataTable = ListToDataTable(list);
上述代码中我们首先创建了一个包含两个学生实例的列表。接着调用我们的静态方法,将List
2.2 使用反射自动映射
public static DataTable ListToDataTable<T>(List<T> list)
{
var dataTable = new DataTable();
if (list == null || !list.Any()) return dataTable;
var properties = typeof(T).GetProperties();
foreach (var property in properties)
{
dataTable.Columns.Add(property.Name, Nullable.GetUnderlyingType(property.PropertyType) ?? property.PropertyType);
}
foreach (var item in list)
{
var dataRow = dataTable.NewRow();
foreach (var property in properties)
dataRow[property.Name] = property.GetValue(item) ?? DBNull.Value;
dataTable.Rows.Add(dataRow);
}
return dataTable;
}
这段代码使用了反射技术,通过获取泛型参数T的属性信息,自动将List
同样的,我们省略了类型转换的过程,实践中需要根据具体情况添加相关代码逻辑。
使用方法:
var list = new List<Student>
{
new Student { Name = "Tom", Age = 18 },
new Student { Name = "Jerry", Age = 20 }
};
var dataTable = ListToDataTable(list);
同样是通过静态方法调用,我们实现了List到DataTable的迁移。
以上就是"C#中DataTable和List互转的示例代码"的完整攻略,其中介绍了具体实现的两种方式,包括了示例代码以及使用方法的详细介绍。希望可以对您有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#中DataTable和List互转的示例代码 - Python技术站