C#实现利用泛型将DataSet转为Model的方法

下面是详细的讲解。

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技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • asp.net(c#)判断远程图片是否存在

    当我们在使用asp.net(c#)获取远程图片时,我们需要先判断该图片是否存在。为了判断图片是否存在,我们可以使用HTTP协议的HEAD请求方法。HEAD请求方法会返回HTTP头信息,但不会返回HTTP body信息。如果返回状态码为200,说明该图片存在;如果返回状态码为404,说明该图片不存在。 下面是使用C#代码判断远程图片是否存在的完整攻略: 步骤一…

    C# 2023年6月3日
    00
  • C#生成随机数的方法小结

    C#生成随机数的方法小结 介绍 在编程中,如何生成随机数是常见的需求。C#提供了多种生成随机数的方法,本文将对这些方法进行小结介绍。 Random类 Random类是C#提供的随机数生成类,它可以生成伪随机数序列。以下是使用Random类生成随机数的示例: Random random = new Random(); int randomNumber = ra…

    C# 2023年5月31日
    00
  • 详解C# Protobuf如何做到0分配内存的序列化

    C# protobuf是Google开发的一种高效的序列化格式。相较于其他序列化方式(比如XML或Json),它所占用的空间更少,同时速度更快,因为它是二进制序列化格式。在进行序列化过程中,内存的分配是一个非常重要的问题,因为大量的内存分配会导致性能下降甚至内存溢出。本文将详细介绍C# protobuf如何实现0分配内存的序列化。 一、使用“MemorySt…

    C# 2023年5月31日
    00
  • C# Stream.SetLength – 设置流的长度

    Stream.SetLength() 方法是用于设置流的长度的方法,通过该方法可以更改流的大小,包括增加或减少流的大小。 作用 当需要向文件中写入数据时,如果文件已经存在,并且需要覆盖其中的一部分数据或向文件中间插入数据,则需要确保指定的长度和位置正确。Stream.SetLength() 方法可以用于这种情况,它可以更改文件流的长度,从而为新增或修改数据腾…

    C# 2023年4月19日
    00
  • Unity实现鼠标双击与长按的检测

    下面是Unity实现鼠标双击与长按的检测的完整攻略。 检测鼠标双击 要在Unity中检测鼠标双击,可以使用以下步骤: 在需要检测双击的对象上添加组件EventSystem; 在需要检测双击的对象上添加组件InputField; 通过代码实现鼠标双击的检测。 以下是一个简单的示例代码,实现了在鼠标双击时输出一段提示信息: public class Double…

    C# 2023年6月3日
    00
  • ASP.NET MVC实现城市或车型三级联动

    当我们需要实现城市或车型三级联动的功能时,可以使用 ASP.NET MVC 框架来实现。下面是详细的攻略: 步骤1:创建数据库 在 SQL Server 中创建一个名为“City”的数据库,并添加以下表: Province 表 列名 数据类型 Id int Name nvarchar(50) City 表 列名 数据类型 Id int Name nvarch…

    C# 2023年5月12日
    00
  • c# 开发文字识别软件

    C#开发文字识别软件攻略 1. 确定需求和选取OCR引擎 在开始C#开发文字识别软件之前,我们需要明确需求和选择OCR(Optical Character Recognition,光学字符识别)引擎。OCR引擎是用来识别图片中的文字,将其转换为文本形式的工具。OCR引擎有很多种,我们需要根据实际需求选择适合的引擎。 常见的OCR引擎有Tesseract、百度…

    C# 2023年5月15日
    00
  • C#比较二个数组并找出相同或不同元素的方法

    针对“C#比较二个数组并找出相同或不同元素的方法”的完整攻略,以下是具体步骤: 步骤一:创建两个数组 首先,我们需要创建两个数组,来保存要进行比较的数据。可以使用 int[] 或者 string[] 等类型,以下是示例代码: int[] arr1 = new int[] {1, 2, 3, 4, 5}; int[] arr2 = new int[] {3, …

    C# 2023年6月7日
    00
合作推广
合作推广
分享本页
返回顶部