虽说反射的效率比较低,但是在当今的时代,盛行的大数据,以及高并发的产生,硬件的产能正在逐渐的提升,所以我们可以用空间来换取时间.反射所消耗的那些性能问题其实在企业级开发而言也就无所谓了.二 : 反射得确是可以提升开发效率.

将SqlDataReader反射转换为Model实体,省去了每个Reader还要判断转换一下,如此消耗开发效率的问题,怎么能容忍呢?

代码 :

  1. /// <summary>
  2. /// 将SqlDataReader转换为Model实体
  3. /// </summary>
  4. /// <typeparam name="T">实例类名</typeparam>
  5. /// <param name="dr">Reader对象</param>
  6. /// <returns>实体对象</returns>
  7. public static T ReaderToModel<T>(IDataReader dr)
  8. {
  9. try
  10. {
  11. using (dr)
  12. {
  13. if (dr.Read())
  14. {
  15. Type modelType = typeof(T);
  16. T model = Activator.CreateInstance<T>();
  17. for (int i = ; i < dr.FieldCount; i++)
  18. {
  19. if(!IsNullOrDbNull(dr[i]))
  20. {
  21. PropertyInfo pi = modelType.GetProperty(GetPropertyName(dr.GetName(i)));
  22. pi.SetValue(model, HackType(dr[i], pi.PropertyType), null);
  23. }
  24. }
  25. return model;
  26. }
  27. }
  28. return default(T);
  29. }
  30. catch (Exception)
  31. {
  32.  
  33. throw;
  34. }
  35. }
  36.  
  37. /// <summary>
  38. /// 对可空类型进行判断.
  39. /// </summary>
  40. private static object HackType(object value, Type conversionType)
  41. {
  42. if (conversionType.IsGenericType && conversionType.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))
  43. {
  44. if (value == null)
  45. {
  46. return null;
  47. }
  48. System.ComponentModel.NullableConverter nullAbleConverter = new System.ComponentModel.NullableConverter(conversionType);
  49. conversionType = nullAbleConverter.UnderlyingType;
  50. }
  51. return Convert.ChangeType(value, conversionType);
  52. }
  53.  
  54. /// <summary>
  55. /// 判断字段值是否为NUll
  56. /// </summary>
  57. /// <param name="obj"></param>
  58. /// <returns></returns>
  59. private static bool IsNullOrDbNull(object obj)
  60. {
  61. return ((obj is DBNull) || string.IsNullOrEmpty(obj.ToString())) ? true : false;
  62. }
  63.  
  64. /// <summary>
  65. /// 获取属性类的名称
  66. /// </summary>
  67. /// <param name="column">列名</param>
  68. /// <returns>列名</returns>
  69. private static string GetPropertyName(string column)
  70. {
  71. string[] narr = column.Split('_');
  72. column = "";
  73. for (int i = ; i < narr.Length; i++)
  74. {
  75. if (narr[i].Length > )
  76. {
  77. column += narr[i].Substring(, ).ToUpper() + narr[i].Substring();
  78. }
  79. else
  80. {
  81. column += narr[i].Substring(, ).ToUpper();
  82. }
  83. }
  84. return column;
  85. }

C# 反射之SqlDatareader转换为Model实体.的更多相关文章

  1. DataTable转换为Model实体对象

    记得在学校的时候,接触得最多的就是SqlHelper,每次在读取的时候不管是DataTable还是DataReader转换为实体对象的时候是最恼火的,因为要写很多代码,而且没有什么意义.后面接触到了反 ...

  2. C#把 DataTable转换为Model实体

    public static List<T> GetModelFromDB<T>( DataTable dt ) { List<T> data = new List& ...

  3. 反射实现 Data To Model

    调用 : public ActionResult Index() { DataTable dt = new DataTable(); dt.Columns.Add("Name"); ...

  4. DataTable和DataRow利用反射直接转换为Model对象的扩展方法类

    DataTable和DataRow利用反射直接转换为Model对象的扩展方法类   /// <summary> /// 类 说 明:给DataTable和DataRow扩展方法,直接转换为 ...

  5. 利用泛型和反射,管理配置文件,把Model转换成数据行,并把数据行转换成Model

    利用泛型和反射,管理配置文件,把Model转换成数据行,并把数据行转换成Model   使用场景:网站配置项目,为了便于管理,网站有几个Model类来管理配置文件, 比如ConfigWebsiteMo ...

  6. 利用反射和泛型把Model对象按行储存进数据库以及按行取出然后转换成Model 类实例 MVC网站通用配置项管理

    利用反射和泛型把Model对象按行储存进数据库以及按行取出然后转换成Model 类实例 MVC网站通用配置项管理   2018-3-10 15:18 | 发布:Admin | 分类:代码库 | 评论: ...

  7. 把汉字转换为html实体编码

    背景:工作中需要把汉字转换为html实体编码实现方式:import org.apache.commons.lang.StringEscapeUtils;public static void main( ...

  8. IOS 字典快速转换为Model 模型

    一般情况下IOS得局部页面加载的过程是,创建一个Model然后,将Nib文件与Model进行关联,然后能够快速的获取到Nib文件上的控件实例.操作生成页面. 但是原生的内容是没有直接通过Json获取M ...

  9. 把字符转换为 HTML 实体

    把字符转换为HTML实体:htmlentities() 把HTML实体转换回字符:html_entity_decode() 把预定义的字符 "<" (小于)和 "& ...

随机推荐

  1. 全卷积网络(FCN)与图像分割

    最近在做物体检测,也用到了全卷积网络,来此学习一波. 这篇文章写了很好,有利于入门,在此记录一下: http://blog.csdn.net/taigw/article/details/5140144 ...

  2. Jar 包 及运行Jar包 - 转载

    Eclipse的jar file和Runnable JAR file的区别 - 及bat运行Runnable JAR文件 1.两种jar的区别 jar file是最普通的jar包,即平时我们工程中li ...

  3. STDIN_FILENO

    1.STDIN_FILENO的作用STDIN_FILENO属于系统API接口库,其声明为 int 型,是一个打开文件句柄,对应的函数主要包括 open/read/write/close 等系统级调用. ...

  4. Python — List、Set、Tuple、Dictionary之间的区别、参数传递

    1.list 列表 有序集合,随时增删.包含的数据类型可以不同:整数.浮点数.字符串.list.tuple.dict.set.bool.空值.常量. list = [12, 'Yummy', 19.2 ...

  5. poj2723 2-sat

    当两个门锁相同时,这个钥匙必须用,不同时分开用 可以直接遍历门,当然二分更快 #include<map> #include<set> #include<cmath> ...

  6. Ceph Monitor基础架构与模块详解

    转自:https://www.ustack.com/blog/ceph-monitor/ Ceph rados cluster离不开Monitor,如果没有Monitor,则Ceph将无法执行一条简单 ...

  7. Project Euler 126 - Cuboid layers

    这题先是推公式… 狂用不完全归纳+二次回归,最后推出这么一个奇怪的公式 \[f(t,x,y,z)=4(t-1)(x+y+z+t-2)+2(xy+yz+xz)\] 表示长宽高为\(x\).\(y\).\ ...

  8. docker 私有registry 配置

    备注:此处使用linux镜像配置仓库 registry 启动步骤 https://hub.docker.com/_/registry/ docker login docker pull registr ...

  9. UIView常用属性与方法/UIKit继承结构

    UIView常用属性与方法 @interface UIView : UIResponder<NSCoding, UIAppearance, UIAppearanceContainer, UIDy ...

  10. C#模拟网络POST请求

    using System; using System.IO; using System.Net; using System.Text; using System.Collections.Generic ...