C#中反射和扩展方法如何运用

前段时间做了一个练手的小项目,名叫Book_Bar,用来卖书的,采用的是三层架构,也就是Models,IDAL,DAL,BLL 和 Web , 在DAL层中各个类中有一个方法比较常用,那就是RowToClass ,顾名思义,也就是将DataTable 中的数据封装到Models 中。结果导致在DAL各个类中写了很多类似的方法,后来就直接把它抽取出来做成了DataTable和DataRow的扩展方法,下面是代码:

  using System;  using System.Collections.Generic;  using System.Data;  using System.Reflection;      namespace DAL  {   /// <summary>   /// 用于给 DataTable和 DataRow扩展方法   /// </summary>   public static class TableExtensionMethod   {      /// <summary>    /// 功能:    ///  给DataTable扩展了一个方法,能够将DataTable中的行转变为对应的class对象,并封装到List集合中;    /// </summary>    /// <typeparam name="T">需要转变成为的class类型</typeparam>    /// <param name="table">传入的DataTable对象</param>    /// <returns>返回一个封装了对应class的List集合</returns>    public static List<T> TableToClass<T>(this DataTable table)    {     Type type = typeof(T);     PropertyInfo[] propArr = type.GetProperties();//获取所有属性     List<T> list = new List<T>();     DataRowCollection rows = table.Rows;     int len = rows[0].ItemArray.Length;//获取第一行的列数,即class的属性个数     for (int i = 0; i < rows.Count; i++)     {      T t = (T)Activator.CreateInstance(type);      for (int j = 0; j < len; j++)//这里之所以不使用propArr.Length,是因为有些Models的属性在数据表中不存在对应的列      {       propArr[j].SetValue(t, rows[i][j]);      }      list.Add(t);      t = default(T);     }     return list;    }      /// <summary>    /// 功能:    ///  DataRow的扩展方法;    ///  能够将DataRow对象封装到泛型对象中    /// </summary>    /// <typeparam name="T">需要转换成为的class类型</typeparam>    /// <param name="row">被转换的行</param>    /// <returns>封装了行数据的class对象</returns>    public static T RowToClass<T>(this DataRow row)    {     //Type type = Assembly.Load(classFullName).GetType();     Type type = typeof(T);     T t = (T)Activator.CreateInstance(type);     PropertyInfo[] propArr = type.GetProperties();     int len = row.ItemArray.Length;     for (int i = 0; i < len; i++)     {      propArr[i].SetValue(t, row[i]);     }     return t;    }      /// <summary>    /// 功能:    ///  DataRowCollection的扩展方法;    ///  能够将DataRowCollection对象封装到泛型List集合中    /// </summary>    /// <typeparam name="T"></typeparam>    /// <param name="rows"></param>    /// <returns></returns>    public static List<T> RowToClass<T>(this DataRow row, DataRow[] rowArr)    {     Type type = typeof(T);     PropertyInfo[] propArr = type.GetProperties();     int len = rowArr[0].ItemArray.Length;//获取数据表第一行的列数,即属性个数     List<T> list = new List<T>();     for (int i = 0; i < rowArr.Length; i++)     {      T t = (T)Activator.CreateInstance(type);      for (int j = 0; j < len; j++)      {       propArr[j].SetValue(t, rowArr[i][j]);      }      list.Add(t);      t = default(T);     }     return list;    }   }  }

上面用到了泛型,反射,扩展方法。

之前在使用这行代码时出了点小问题:

propArr[i].SetValue(t, row[i]);

报了一个类型转换异常,断点调试之后发现是因为 Models 中的属性的排列和数据表的列的顺序不一样导致的,参照数据表中字段的顺序修改过来就好,还有一点就是在循环对属性进行赋值时,我选用的是数据表中列的个数,而不是属性的个数,(也就是代码中这里之所以不使用propArr.Length,是因为有些Models的属性在数据表中不存在对应的列
)。

(0)

相关推荐

  • 在Mac OS X中安装PHP扩展支持的方法

    Linux系统中有着许多PHP扩展,不过都需要用户们手动安装后才可以使用,一些MAC OS X用户想在自己的电脑上安装和使用这些PHP扩展,那么该怎么进行安装呢?下面就和小编一起来看看具体的安装步骤吧 ...

  • 从word中提取图片的方法汇总 如何将word中图片提取出来

    方法1:使用截图方法来提取并保存图片,如果你安装了QQ并且运行了的话,你可以使用Ctrl+Alt+A来截图,然后在QQ聊天框中按CTRL+V来保存图片,当然你可以在PS新建文档按CTRL+V来粘贴图片 ...

  • 在PPT中插入Flash动画方法4种

    现在很多学科经常要做一些研究性学习或者调查报告,使用Powerpoint是个不错的主意。 而很多时候,我们需要添加一些flash动画来使我们的幻灯片更加生动、美观和具有说服力。但是Powerpoint ...

  • 苹果库乐队中如何设置铃声?库乐队苹果版APP中设置铃声的方法

    库乐队APP一款可以在线制作DJ音乐的软件库乐队app使用触控乐器.麦克风或吉他并立即录制支持多达 32 条轨道的演奏,iOS 11 中的音频单元扩展允许您直接弹奏.录制以及将第三方乐器或效果混合到库 ...

  • 如何使电脑中文件的扩展名不再显示?

    在使用电脑时,如果我们想要隐藏文件的扩展名该怎么做呢?方法很简单,下面小编就来为大家介绍.具体如下:1. 下图所示文件的扩展名为"PNG",小编接下来就要隐藏这个扩展名.2. 点击 ...

  • 在UC浏览器中怎么打开扩展中心?

    许多小伙伴都会使用UC浏览器进行一些网页的浏览,如果我们想要在浏览器中将扩展中心打开应该如何操作呢?今天,小编就教大家在UC浏览器中怎么打开扩展中心.具体如下:1. 首先,我么将UC浏览器打开,如图. ...

  • 怎么显示Win10系统中文件的扩展名

    使用Windows10系统电脑的小伙伴,为了可以快速知道某文件的类型,因此想要显示文件的扩展名,但是却不知道如何显示,那么小编就来为大家介绍一下吧.具体如下:1. 第一步,双击或者右击打开想要显示文件 ...

  • 如何在Pr中安装BeatEdit扩展插件

    Pr是现在十分常用的一款视频编辑软件,有些新用户不知道如何在Pr中安装BeatEdit扩展插件,接下来小编就给大家介绍一下具体的操作步骤.具体如下:1. 首先第一步打开电脑浏览器,根据下图箭头所指,搜 ...

  • 如何在Edge浏览器中安装AdBlock扩展程序

    现在有很多人喜欢在电脑上使用Edge浏览器上网,有些新用户不知道如何安装AdBlock扩展程序,接下来小编就给大家介绍一下具体的操作步骤.具体如下:1. 首先第一步先打开电脑中的Edge浏览器,接着根 ...