反射帮助类

  1. using System;
  2. using System.Reflection;
  3. using System.Data;
  4. using System.Drawing;
  5. using System.Resources;
  6. using System.ComponentModel;
  7. using System.Text;
  8. using System.IO;
  9.  
  10. namespace Core.Common
  11. {
  12. /// <summary>
  13. /// 反射辅助类
  14. /// </summary>
  15. public static class ReflectHelper
  16. {
  17. #region 成员读写
  18. /// <summary>
  19. /// 通过数据行填充实体类型
  20. /// </summary>
  21. /// <param name="model">实体对象</param>
  22. /// <param name="dRow">数据行</param>
  23. public static void FillInstanceValue(object model, DataRow dRow)
  24. {
  25. Type type = model.GetType();
  26. for (int i = ; i < dRow.Table.Columns.Count; i++)
  27. {
  28. PropertyInfo property = type.GetProperty(dRow.Table.Columns[i].ColumnName);
  29. if (property != null)
  30. {
  31. property.SetValue(model, dRow[i], null);
  32. }
  33. }
  34. }
  35.  
  36. /// <summary>
  37. /// 通过数据只读器填充实体类型
  38. /// </summary>
  39. /// <param name="model">实体对象</param>
  40. /// <param name="dr">数据只读器</param>
  41. public static void FillInstanceValue(object model, IDataReader dr)
  42. {
  43. Type type = model.GetType();
  44. for (int i = ; i < dr.FieldCount; i++)
  45. {
  46. PropertyInfo property = type.GetProperty(dr.GetName(i));
  47. if (property != null)
  48. {
  49. property.SetValue(model, dr[i], null);
  50. }
  51. }
  52. }
  53.  
  54. /// <summary>
  55. /// 获取实体相关属性的值
  56. /// </summary>
  57. /// <param name="obj"></param>
  58. /// <param name="propertyName"></param>
  59. /// <returns></returns>
  60. public static object GetInstanceValue(object obj, string propertyName)
  61. {
  62. object objRet = null;
  63. if (!string.IsNullOrEmpty(propertyName))
  64. {
  65. PropertyDescriptor descriptor = TypeDescriptor.GetProperties(obj).Find(propertyName, true);
  66. if (descriptor != null)
  67. {
  68. objRet = descriptor.GetValue(obj);
  69. }
  70. }
  71. return objRet;
  72. }
  73. #endregion
  74.  
  75. #region 方法调用
  76. /// <summary>
  77. /// 直接调用内部对象的方法/函数或获取属性(支持重载调用)
  78. /// </summary>
  79. /// <param name="refType">目标数据类型</param>
  80. /// <param name="funName">函数名称,区分大小写。</param>
  81. /// <param name="objInitial">如果调用属性,则为相关对象的初始化数据,否则为Null。</param>
  82. /// <param name="funParams">函数参数信息</param>
  83. /// <returns>运行结果</returns>
  84. public static object InvokeMethodOrGetProperty(Type refType, string funName, object[] objInitial, params object[] funParams)
  85. {
  86. MemberInfo[] mis = refType.GetMember(funName);
  87. if (mis.Length < )
  88. {
  89. throw new InvalidProgramException(string.Concat("函数/方法 [", funName, "] 在指定类型(", refType.ToString(), ")中不存在!"));
  90. }
  91. else
  92. {
  93. MethodInfo targetMethod = null;
  94. StringBuilder pb = new StringBuilder();
  95. foreach (MemberInfo mi in mis)
  96. {
  97. if (mi.MemberType != MemberTypes.Method)
  98. {
  99. if (mi.MemberType == MemberTypes.Property)
  100. {
  101. #region 调用属性方法Get
  102. targetMethod = ((PropertyInfo)mi).GetGetMethod();
  103. break;
  104. #endregion
  105. }
  106. else
  107. {
  108. throw new InvalidProgramException(string.Concat("[", funName, "] 不是有效的函数/属性方法!"));
  109. }
  110. }
  111. else
  112. {
  113. #region 检查函数参数和数据类型 绑定正确的函数到目标调用
  114. bool validParamsLen = false, validParamsType = false;
  115.  
  116. MethodInfo curMethod = (MethodInfo)mi;
  117. ParameterInfo[] pis = curMethod.GetParameters();
  118. if (pis.Length == funParams.Length)
  119. {
  120. validParamsLen = true;
  121.  
  122. pb = new StringBuilder();
  123. bool paramFlag = true;
  124. int paramIdx = ;
  125.  
  126. #region 检查数据类型 设置validParamsType是否有效
  127. foreach (ParameterInfo pi in pis)
  128. {
  129. pb.AppendFormat("Parameter {0}: Type={1}, Name={2}\n", paramIdx, pi.ParameterType, pi.Name);
  130.  
  131. //不对Null和接受Object类型的参数检查
  132. if (funParams[paramIdx] != null && pi.ParameterType != typeof(object) &&
  133. (pi.ParameterType != funParams[paramIdx].GetType()))
  134. {
  135. #region 检查类型是否兼容
  136. try
  137. {
  138. funParams[paramIdx] = Convert.ChangeType(funParams[paramIdx], pi.ParameterType);
  139. }
  140. catch (Exception)
  141. {
  142. paramFlag = false;
  143. }
  144. #endregion
  145. //break;
  146. }
  147. ++paramIdx;
  148. }
  149. #endregion
  150.  
  151. if (paramFlag == true)
  152. {
  153. validParamsType = true;
  154. }
  155. else
  156. {
  157. continue;
  158. }
  159.  
  160. if (validParamsLen && validParamsType)
  161. {
  162. targetMethod = curMethod;
  163. break;
  164. }
  165. }
  166. #endregion
  167. }
  168. }
  169.  
  170. if (targetMethod != null)
  171. {
  172. object objReturn = null;
  173. #region 兼顾效率和兼容重载函数调用
  174. try
  175. {
  176. object objInstance = System.Activator.CreateInstance(refType, objInitial);
  177. objReturn = targetMethod.Invoke(objInstance, BindingFlags.InvokeMethod, Type.DefaultBinder, funParams,
  178. System.Globalization.CultureInfo.InvariantCulture);
  179. }
  180. catch (Exception)
  181. {
  182. objReturn = refType.InvokeMember(funName, BindingFlags.InvokeMethod, Type.DefaultBinder, null, funParams);
  183. }
  184. #endregion
  185. return objReturn;
  186. }
  187. else
  188. {
  189. throw new InvalidProgramException(string.Concat("函数/方法 [", refType.ToString(), ".", funName,
  190. "(args ...) ] 参数长度和数据类型不正确!\n 引用参数信息参考:\n",
  191. pb.ToString()));
  192. }
  193. }
  194.  
  195. }
  196.  
  197. /// <summary>
  198. /// 调用相关实体类型的函数方法
  199. /// </summary>
  200. /// <param name="refType">实体类型</param>
  201. /// <param name="funName">函数名称</param>
  202. /// <param name="funParams">函数参数列表</param>
  203. /// <returns>调用该函数之后的结果</returns>
  204. public static object InvokeFunction(Type refType, string funName, params object[] funParams)
  205. {
  206. return InvokeMethodOrGetProperty(refType, funName, null, funParams);
  207. }
  208. #endregion
  209.  
  210. #region 资源获取
  211. /// <summary>
  212. /// 获取程序集资源的位图资源
  213. /// </summary>
  214. /// <param name="assemblyType">程序集中的某一对象类型</param>
  215. /// <param name="resourceHolder">资源的根名称。例如,名为“MyResource.en-US.resources”的资源文件的根名称为“MyResource”。</param>
  216. /// <param name="imageName">资源项名称</param>
  217. public static Bitmap LoadBitmap(Type assemblyType, string resourceHolder, string imageName)
  218. {
  219. Assembly thisAssembly = Assembly.GetAssembly(assemblyType);
  220. ResourceManager rm = new ResourceManager(resourceHolder, thisAssembly);
  221. return (Bitmap)rm.GetObject(imageName);
  222. }
  223.  
  224. /// <summary>
  225. /// 获取程序集资源的文本资源
  226. /// </summary>
  227. /// <param name="assemblyType">程序集中的某一对象类型</param>
  228. /// <param name="resName">资源项名称</param>
  229. /// <param name="resourceHolder">资源的根名称。例如,名为“MyResource.en-US.resources”的资源文件的根名称为“MyResource”。</param>
  230. public static string GetStringRes(Type assemblyType, string resName, string resourceHolder)
  231. {
  232. Assembly thisAssembly = Assembly.GetAssembly(assemblyType);
  233. ResourceManager rm = new ResourceManager(resourceHolder, thisAssembly);
  234. return rm.GetString(resName);
  235. }
  236.  
  237. /// <summary>
  238. /// 获取程序集嵌入资源的文本形式
  239. /// </summary>
  240. /// <param name="assemblyType">程序集中的某一对象类型</param>
  241. /// <param name="charset">字符集编码</param>
  242. /// <param name="ResName">嵌入资源相对路径</param>
  243. /// <returns>如没找到该资源则返回空字符</returns>
  244. public static string GetManifestString(Type assemblyType, string charset, string ResName)
  245. {
  246. Assembly asm = Assembly.GetAssembly(assemblyType);
  247. Stream st = asm.GetManifestResourceStream(string.Concat(assemblyType.Namespace,
  248. ".", ResName.Replace("/", ".")));
  249. if (st == null) { return ""; }
  250. int iLen = (int)st.Length;
  251. byte[] bytes = new byte[iLen];
  252. st.Read(bytes, , iLen);
  253. return (bytes != null) ? Encoding.GetEncoding(charset).GetString(bytes) : "";
  254. }
  255. #endregion
  256.  
  257. }
  258. }

反射帮类

泛型反射帮助类

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data;
  4. using System.Data.SqlClient;
  5. using System.Linq;
  6. using System.Reflection;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9.  
  10. namespace DAL
  11. {
  12. public class Expdal
  13. {
  14. /// <summary>
  15. /// 显示
  16. /// </summary>
  17. /// <typeparam name="T"></typeparam>
  18. /// <returns></returns>
  19. public static List<T> GetTs<T>()where T:new()
  20. {
  21. //获取Type对象,反射操作基本都是用Type进行的
  22. Type type = typeof(T);
  23. string sql = "select * from Expense";
  24. SqlDataReader dr = DBHelper.GetDataReader(sql);
  25. //获取Type对象的所有公共属性
  26. PropertyInfo[] info = type.GetProperties();
  27. List<T> modelList = new List<T>();
  28. //定义泛型对象
  29. T obj = default(T);
  30. while (dr.Read())
  31. {
  32. obj = new T();
  33. foreach (PropertyInfo item in info)
  34. {
  35. item.SetValue(obj, dr[item.Name]);
  36. }
  37. modelList.Add(obj);
  38. }
  39. dr.Close();
  40. return modelList;
  41. }
  42. /// <summary>
  43. /// 添加
  44. /// </summary>
  45. /// <typeparam name="T"></typeparam>
  46. /// <param name="nodel"></param>
  47. /// <returns></returns>
  48. public static int AddExpense<T>(T nodel)where T : new()
  49. {
  50. Type type = typeof(T);
  51. string sql = string.Format("insert into {0} ", type.Name);
  52. string val = "";
  53. string link = "'";
  54. //获取Type对象所有公共属性
  55. PropertyInfo[] info = type.GetProperties();
  56. foreach (PropertyInfo item in info)
  57. {
  58. val += link + item.GetValue(nodel) + link+",";//定义字段变量
  59. }
  60. val = val.Substring(, val.Length - );
  61. val += ")";
  62. sql += "values(" + val.Remove(,);
  63. //调用执行方法
  64. return DBHelper.ExecuteNonQuery(sql);
  65. }
  66. /// <summary>
  67. /// 修改
  68. /// </summary>
  69. /// <typeparam name="T"></typeparam>
  70. /// <param name="nodel"></param>
  71. /// <param name="id"></param>
  72. /// <returns></returns>
  73. public static int UpdateExpense<T>(T nodel,int id)where T:new()
  74. {
  75. Type type = typeof(T);
  76. string sql = string.Format("update {0} set ", type.Name);
  77.  
  78. PropertyInfo[] info = type.GetProperties();
  79. string link = "";
  80. foreach (PropertyInfo item in info)
  81. {
  82. object val = item.GetValue(nodel);
  83. if (val!=null)
  84. {
  85. sql += link + item.Name + "='" + val + "' ";
  86. link = ", ";
  87. }
  88. }
  89. sql = sql.Remove(, );
  90. sql += string.Format(" where EId=" + id);
  91. return DBHelper.ExecuteNonQuery(sql);
  92. }
  93. /// <summary>
  94. /// 删除
  95. /// </summary>
  96. /// <typeparam name="T"></typeparam>
  97. /// <param name="id"></param>
  98. /// <returns></returns>
  99. public static int DeleteByEId<T>(int id)where T : new()
  100. {
  101. Type type = typeof(T);
  102. string sql = string.Format($"delete from {type.Name} where EId={id}");
  103. return DBHelper.ExecuteNonQuery(sql);
  104. }
  105. }
  106. }

泛型反射帮助类

C#工具:反射帮助类 泛型反射帮助类的更多相关文章

  1. (翻译)反射处理java泛型

    当我们声明了一个泛型的接口或类,或需要一个子类继承至这个泛型类,而我们又希望利用反射获取这些泛型参数信息.这就是本文将要介绍的ReflectionUtil就是为了解决这类问题的辅助工具类,为java. ...

  2. 已看1.熟练的使用Java语言进行面向对象程序设计,有良好的编程习惯,熟悉常用的Java API,包括集合框架、多线程(并发编程)、I/O(NIO)、Socket、JDBC、XML、反射等。[泛型]\

    1.熟练的使用Java语言进行面向对象程序设计,有良好的编程习惯,熟悉常用的Java API,包括集合框架.多线程(并发编程).I/O(NIO).Socket.JDBC.XML.反射等.[泛型]\1* ...

  3. 反射(学习整理)----Class类和加载器ClassLoader类的整理

    1.学习反射的时整理的笔记!Class类和ClassLoader类的简单介绍 反射机制中的Class Class内部到底有什么呢?看下图! 代码: Class cls=Person.class; .C ...

  4. JAVA异常处理、常用类、反射、集合

    异常 异常:在Java中是指被一个方法抛出的对象. 分类:检查异常.运行时异常.错误 运行时异常(uncheckd):RuntimeException和其子类 检查异常(checkd/搜检异常):指E ...

  5. 反射方式,获取出集合ArrayList类的class文件对象

    /* * 定义集合类,泛型String * 要求向集合中添加Integer类型 * * 反射方式,获取出集合ArrayList类的class文件对象 * 通过class文件对象,调用add方法 * * ...

  6. [Java反射基础四]通过反射了解集合泛型的本质

    本文接上文"方法反射的基本操作",利用反射了解下java集合中泛型的本质 1.初始化两个集合,一个使用泛型,一个不使用 ArrayList list1 = new ArrayLis ...

  7. JavaSE基础复习---Class类与反射机制

    ---恢复内容开始--- 目录: 1.java.lang.class类 2.Java中的反射机制 3.运行时与编译时概念 1. java.lang.class类 Java程序在运行时,Java运行时系 ...

  8. Java常用类及反射,类加载

    1.系统相关类 Java提供了System类和Runtime类来与程序运行的平台进行交互 A.System类代表当前Java程序的运行平台 a. System类是一个final类,该类的所有属性和方法 ...

  9. java--分析简单java类与反射的联系

    分析简单java类与反射的联系 web对反射的操作支持 在JSP之中有一种技术--javaBean.而且在jsp里面也配套有相应的操作方式,javaBean的核心在于简单java类,于是下面演示此操作 ...

随机推荐

  1. 【爆料】-《堪培拉大学毕业证书》Canberra一模一样原件

    ☞堪培拉大学毕业证书[微/Q:2544033233◆WeChat:CC6669834]UC毕业证书/联系人Alice[查看点击百度快照查看][留信网学历认证&博士&硕士&海归& ...

  2. Twitter分布式自增ID算法snowflake原理解析

    以JAVA为例 Twitter分布式自增ID算法snowflake,生成的是Long类型的id,一个Long类型占8个字节,每个字节占8比特,也就是说一个Long类型占64个比特(0和1). 那么一个 ...

  3. 死链接检查工具:Xenu 使用教程

    一.软件作用 Xenu 全称Xenu’s Link Sleuth,是一款英文软件,界面单一,功能简单,使用方法很容易掌握.虽然看起来简单,但Xenu却拥有强大的功能.Xenu可以对网站的内链进行详细的 ...

  4. numpy C语言源代码调试(三)

    鉴于ddd过于简陋,希望找一个新一些的调试工具,看到有很多人推荐gdbgui,这是一个非常新的调试工具,前端使用浏览器,现在采用这一架构的软件越来越多,可以完全不必依赖庞大的gui类库,安装使用比较方 ...

  5. c#Socket服务器与客户端的开发(2)

    上一篇文章我们使用原生的socket分别实现了服务器和客户端, 本篇文章使用SuperSocket来开发实现服务器, 之前也介绍了SuperSocket是一个轻量级, 跨平台而且可扩展的 .Net/M ...

  6. 腾讯云存储专家深度解读基于Ceph对象存储的混合云机制

    背景 毫无疑问,乘着云计算发展的东风,Ceph已经是当今最火热的软件定义存储开源项目.如下图所示,它在同一底层平台之上可以对外提供三种存储接口,分别是文件存储.对象存储以及块存储,本文主要关注的是对象 ...

  7. xamarin android如何将Java.Lang.Object类型转成C#类型

    问题起源 其实这个标题也可以换一个更准确一点,因为我遇到的问题是: xamarin android中的Class继承了Java.Lang.Object ,将json序列化成c#类型时发现无法赋值,序列 ...

  8. 【招聘】.NET高级开发、前端高级开发、测试工程师

    .NET架构师 工作地点:厦门-湖里区 工作年限:5年及以上 学历要求:大专或以上 工资范围:15000元 - 25000元 福利待遇:五险一金,带薪年休假,年度旅游,丰富的员工团队活动:生日会.中秋 ...

  9. USB总线标准

    1.USB总线类型: OHCI(Open Host Controller Interface)是支持USB1.1的标准,但它不仅仅是针对USB,UHCI(Universal Host Controll ...

  10. 去除inline-block元素间的间距

    一.现象描述 真正意义上的inline-block水平呈现的元素间,换行显示或者空格隔开的情况下会有间距,这是因为浏览器在解析时,会将换行等读取成一个空格导致. 二.移出空格的方法 ① 我们可以去掉元 ...