下面是详细的讲解。
1. 确定需求
在实现将DataSet
转为Model
的方法前,需要先明确需求。本次需求是将DataSet
中的数据转换为Model
类型并返回。
2. 准备数据
假设我们有一个Student
的类型,定义如下:
public class Student
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}
当然,我们也可以使用其他类型来代替Student
,只需稍作修改即可。
接下来,我们准备一个DataSet
,其中包含若干Student
类型的数据。
var dataSet = new DataSet();
var dataTable = new DataTable();
dataTable.Columns.Add("Id", typeof(int));
dataTable.Columns.Add("Name", typeof(string));
dataTable.Columns.Add("Age", typeof(int));
dataTable.Rows.Add(1, "Tom", 18);
dataTable.Rows.Add(2, "Peter", 20);
dataTable.Rows.Add(3, "Mary", 19);
dataSet.Tables.Add(dataTable);
3. 实现转换方法
首先,我们需要确定转换方法的参数和返回值,这里考虑使用泛型来实现:
public static List<T> DataSetToList<T>(DataSet dataSet) where T : new()
{
// ...
}
接着,我们可以通过以下方式来将DataSet
中的数据转换为Model
类型:
public static List<T> DataSetToList<T>(DataSet dataSet) where T : new()
{
List<T> list = new List<T>();
foreach (DataRow row in dataSet.Tables[0].Rows)
{
T model = new T();
foreach (DataColumn column in dataSet.Tables[0].Columns)
{
PropertyInfo propertyInfo = typeof(T).GetProperty(column.ColumnName);
if (propertyInfo != null && row[column.ColumnName] != DBNull.Value)
{
propertyInfo.SetValue(model, row[column.ColumnName], null);
}
}
list.Add(model);
}
return list;
}
该方法使用了两个循环,外部循环遍历DataTable
中的每一行数据,内部循环遍历DataTable
中的每一列,通过反射实现将数据转换为指定的Model
类型。并将转换后的数据添加到List
中并返回。
4. 示例说明
假如我们有一个Student
类型的数据表,并且需要将这个数据表中的数据转换为Student
类型,并返回一个List<Student>
的对象,该如何操作呢?
public static void Main()
{
var dataSet = new DataSet();
var dataTable = new DataTable();
dataTable.Columns.Add("Id", typeof(int));
dataTable.Columns.Add("Name", typeof(string));
dataTable.Columns.Add("Age", typeof(int));
dataTable.Rows.Add(1, "Tom", 18);
dataTable.Rows.Add(2, "Peter", 20);
dataTable.Rows.Add(3, "Mary", 19);
dataSet.Tables.Add(dataTable);
List<Student> list = DataSetToList<Student>(dataSet);
foreach (var student in list)
{
Console.WriteLine("Id: {0} Name: {1} Age: {2}", student.Id, student.Name, student.Age);
}
}
运行结果如下:
Id: 1 Name: Tom Age: 18
Id: 2 Name: Peter Age: 20
Id: 3 Name: Mary Age: 19
因为我们在第3步的代码中将Model
类型写死为了Student
,所以该方法同样适用于其他类型的转换,只需将Student
替换为其他类型即可。
另外,我们对该方法进行了泛型约束,规定了泛型类型必须要有一个无参构造函数,这样才能使用new()
创建实例。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#实现利用泛型将DataSet转为Model的方法 - Python技术站