C#工具:反射帮助类 泛型反射帮助类
反射帮助类
- using System;
- using System.Reflection;
- using System.Data;
- using System.Drawing;
- using System.Resources;
- using System.ComponentModel;
- using System.Text;
- using System.IO;
- namespace Core.Common
- {
- /// <summary>
- /// 反射辅助类
- /// </summary>
- public static class ReflectHelper
- {
- #region 成员读写
- /// <summary>
- /// 通过数据行填充实体类型
- /// </summary>
- /// <param name="model">实体对象</param>
- /// <param name="dRow">数据行</param>
- public static void FillInstanceValue(object model, DataRow dRow)
- {
- Type type = model.GetType();
- for (int i = ; i < dRow.Table.Columns.Count; i++)
- {
- PropertyInfo property = type.GetProperty(dRow.Table.Columns[i].ColumnName);
- if (property != null)
- {
- property.SetValue(model, dRow[i], null);
- }
- }
- }
- /// <summary>
- /// 通过数据只读器填充实体类型
- /// </summary>
- /// <param name="model">实体对象</param>
- /// <param name="dr">数据只读器</param>
- public static void FillInstanceValue(object model, IDataReader dr)
- {
- Type type = model.GetType();
- for (int i = ; i < dr.FieldCount; i++)
- {
- PropertyInfo property = type.GetProperty(dr.GetName(i));
- if (property != null)
- {
- property.SetValue(model, dr[i], null);
- }
- }
- }
- /// <summary>
- /// 获取实体相关属性的值
- /// </summary>
- /// <param name="obj"></param>
- /// <param name="propertyName"></param>
- /// <returns></returns>
- public static object GetInstanceValue(object obj, string propertyName)
- {
- object objRet = null;
- if (!string.IsNullOrEmpty(propertyName))
- {
- PropertyDescriptor descriptor = TypeDescriptor.GetProperties(obj).Find(propertyName, true);
- if (descriptor != null)
- {
- objRet = descriptor.GetValue(obj);
- }
- }
- return objRet;
- }
- #endregion
- #region 方法调用
- /// <summary>
- /// 直接调用内部对象的方法/函数或获取属性(支持重载调用)
- /// </summary>
- /// <param name="refType">目标数据类型</param>
- /// <param name="funName">函数名称,区分大小写。</param>
- /// <param name="objInitial">如果调用属性,则为相关对象的初始化数据,否则为Null。</param>
- /// <param name="funParams">函数参数信息</param>
- /// <returns>运行结果</returns>
- public static object InvokeMethodOrGetProperty(Type refType, string funName, object[] objInitial, params object[] funParams)
- {
- MemberInfo[] mis = refType.GetMember(funName);
- if (mis.Length < )
- {
- throw new InvalidProgramException(string.Concat("函数/方法 [", funName, "] 在指定类型(", refType.ToString(), ")中不存在!"));
- }
- else
- {
- MethodInfo targetMethod = null;
- StringBuilder pb = new StringBuilder();
- foreach (MemberInfo mi in mis)
- {
- if (mi.MemberType != MemberTypes.Method)
- {
- if (mi.MemberType == MemberTypes.Property)
- {
- #region 调用属性方法Get
- targetMethod = ((PropertyInfo)mi).GetGetMethod();
- break;
- #endregion
- }
- else
- {
- throw new InvalidProgramException(string.Concat("[", funName, "] 不是有效的函数/属性方法!"));
- }
- }
- else
- {
- #region 检查函数参数和数据类型 绑定正确的函数到目标调用
- bool validParamsLen = false, validParamsType = false;
- MethodInfo curMethod = (MethodInfo)mi;
- ParameterInfo[] pis = curMethod.GetParameters();
- if (pis.Length == funParams.Length)
- {
- validParamsLen = true;
- pb = new StringBuilder();
- bool paramFlag = true;
- int paramIdx = ;
- #region 检查数据类型 设置validParamsType是否有效
- foreach (ParameterInfo pi in pis)
- {
- pb.AppendFormat("Parameter {0}: Type={1}, Name={2}\n", paramIdx, pi.ParameterType, pi.Name);
- //不对Null和接受Object类型的参数检查
- if (funParams[paramIdx] != null && pi.ParameterType != typeof(object) &&
- (pi.ParameterType != funParams[paramIdx].GetType()))
- {
- #region 检查类型是否兼容
- try
- {
- funParams[paramIdx] = Convert.ChangeType(funParams[paramIdx], pi.ParameterType);
- }
- catch (Exception)
- {
- paramFlag = false;
- }
- #endregion
- //break;
- }
- ++paramIdx;
- }
- #endregion
- if (paramFlag == true)
- {
- validParamsType = true;
- }
- else
- {
- continue;
- }
- if (validParamsLen && validParamsType)
- {
- targetMethod = curMethod;
- break;
- }
- }
- #endregion
- }
- }
- if (targetMethod != null)
- {
- object objReturn = null;
- #region 兼顾效率和兼容重载函数调用
- try
- {
- object objInstance = System.Activator.CreateInstance(refType, objInitial);
- objReturn = targetMethod.Invoke(objInstance, BindingFlags.InvokeMethod, Type.DefaultBinder, funParams,
- System.Globalization.CultureInfo.InvariantCulture);
- }
- catch (Exception)
- {
- objReturn = refType.InvokeMember(funName, BindingFlags.InvokeMethod, Type.DefaultBinder, null, funParams);
- }
- #endregion
- return objReturn;
- }
- else
- {
- throw new InvalidProgramException(string.Concat("函数/方法 [", refType.ToString(), ".", funName,
- "(args ...) ] 参数长度和数据类型不正确!\n 引用参数信息参考:\n",
- pb.ToString()));
- }
- }
- }
- /// <summary>
- /// 调用相关实体类型的函数方法
- /// </summary>
- /// <param name="refType">实体类型</param>
- /// <param name="funName">函数名称</param>
- /// <param name="funParams">函数参数列表</param>
- /// <returns>调用该函数之后的结果</returns>
- public static object InvokeFunction(Type refType, string funName, params object[] funParams)
- {
- return InvokeMethodOrGetProperty(refType, funName, null, funParams);
- }
- #endregion
- #region 资源获取
- /// <summary>
- /// 获取程序集资源的位图资源
- /// </summary>
- /// <param name="assemblyType">程序集中的某一对象类型</param>
- /// <param name="resourceHolder">资源的根名称。例如,名为“MyResource.en-US.resources”的资源文件的根名称为“MyResource”。</param>
- /// <param name="imageName">资源项名称</param>
- public static Bitmap LoadBitmap(Type assemblyType, string resourceHolder, string imageName)
- {
- Assembly thisAssembly = Assembly.GetAssembly(assemblyType);
- ResourceManager rm = new ResourceManager(resourceHolder, thisAssembly);
- return (Bitmap)rm.GetObject(imageName);
- }
- /// <summary>
- /// 获取程序集资源的文本资源
- /// </summary>
- /// <param name="assemblyType">程序集中的某一对象类型</param>
- /// <param name="resName">资源项名称</param>
- /// <param name="resourceHolder">资源的根名称。例如,名为“MyResource.en-US.resources”的资源文件的根名称为“MyResource”。</param>
- public static string GetStringRes(Type assemblyType, string resName, string resourceHolder)
- {
- Assembly thisAssembly = Assembly.GetAssembly(assemblyType);
- ResourceManager rm = new ResourceManager(resourceHolder, thisAssembly);
- return rm.GetString(resName);
- }
- /// <summary>
- /// 获取程序集嵌入资源的文本形式
- /// </summary>
- /// <param name="assemblyType">程序集中的某一对象类型</param>
- /// <param name="charset">字符集编码</param>
- /// <param name="ResName">嵌入资源相对路径</param>
- /// <returns>如没找到该资源则返回空字符</returns>
- public static string GetManifestString(Type assemblyType, string charset, string ResName)
- {
- Assembly asm = Assembly.GetAssembly(assemblyType);
- Stream st = asm.GetManifestResourceStream(string.Concat(assemblyType.Namespace,
- ".", ResName.Replace("/", ".")));
- if (st == null) { return ""; }
- int iLen = (int)st.Length;
- byte[] bytes = new byte[iLen];
- st.Read(bytes, , iLen);
- return (bytes != null) ? Encoding.GetEncoding(charset).GetString(bytes) : "";
- }
- #endregion
- }
- }
反射帮类
泛型反射帮助类
- using System;
- using System.Collections.Generic;
- using System.Data;
- using System.Data.SqlClient;
- using System.Linq;
- using System.Reflection;
- using System.Text;
- using System.Threading.Tasks;
- namespace DAL
- {
- public class Expdal
- {
- /// <summary>
- /// 显示
- /// </summary>
- /// <typeparam name="T"></typeparam>
- /// <returns></returns>
- public static List<T> GetTs<T>()where T:new()
- {
- //获取Type对象,反射操作基本都是用Type进行的
- Type type = typeof(T);
- string sql = "select * from Expense";
- SqlDataReader dr = DBHelper.GetDataReader(sql);
- //获取Type对象的所有公共属性
- PropertyInfo[] info = type.GetProperties();
- List<T> modelList = new List<T>();
- //定义泛型对象
- T obj = default(T);
- while (dr.Read())
- {
- obj = new T();
- foreach (PropertyInfo item in info)
- {
- item.SetValue(obj, dr[item.Name]);
- }
- modelList.Add(obj);
- }
- dr.Close();
- return modelList;
- }
- /// <summary>
- /// 添加
- /// </summary>
- /// <typeparam name="T"></typeparam>
- /// <param name="nodel"></param>
- /// <returns></returns>
- public static int AddExpense<T>(T nodel)where T : new()
- {
- Type type = typeof(T);
- string sql = string.Format("insert into {0} ", type.Name);
- string val = "";
- string link = "'";
- //获取Type对象所有公共属性
- PropertyInfo[] info = type.GetProperties();
- foreach (PropertyInfo item in info)
- {
- val += link + item.GetValue(nodel) + link+",";//定义字段变量
- }
- val = val.Substring(, val.Length - );
- val += ")";
- sql += "values(" + val.Remove(,);
- //调用执行方法
- return DBHelper.ExecuteNonQuery(sql);
- }
- /// <summary>
- /// 修改
- /// </summary>
- /// <typeparam name="T"></typeparam>
- /// <param name="nodel"></param>
- /// <param name="id"></param>
- /// <returns></returns>
- public static int UpdateExpense<T>(T nodel,int id)where T:new()
- {
- Type type = typeof(T);
- string sql = string.Format("update {0} set ", type.Name);
- PropertyInfo[] info = type.GetProperties();
- string link = "";
- foreach (PropertyInfo item in info)
- {
- object val = item.GetValue(nodel);
- if (val!=null)
- {
- sql += link + item.Name + "='" + val + "' ";
- link = ", ";
- }
- }
- sql = sql.Remove(, );
- sql += string.Format(" where EId=" + id);
- return DBHelper.ExecuteNonQuery(sql);
- }
- /// <summary>
- /// 删除
- /// </summary>
- /// <typeparam name="T"></typeparam>
- /// <param name="id"></param>
- /// <returns></returns>
- public static int DeleteByEId<T>(int id)where T : new()
- {
- Type type = typeof(T);
- string sql = string.Format($"delete from {type.Name} where EId={id}");
- return DBHelper.ExecuteNonQuery(sql);
- }
- }
- }
泛型反射帮助类
C#工具:反射帮助类 泛型反射帮助类的更多相关文章
- (翻译)反射处理java泛型
当我们声明了一个泛型的接口或类,或需要一个子类继承至这个泛型类,而我们又希望利用反射获取这些泛型参数信息.这就是本文将要介绍的ReflectionUtil就是为了解决这类问题的辅助工具类,为java. ...
- 已看1.熟练的使用Java语言进行面向对象程序设计,有良好的编程习惯,熟悉常用的Java API,包括集合框架、多线程(并发编程)、I/O(NIO)、Socket、JDBC、XML、反射等。[泛型]\
1.熟练的使用Java语言进行面向对象程序设计,有良好的编程习惯,熟悉常用的Java API,包括集合框架.多线程(并发编程).I/O(NIO).Socket.JDBC.XML.反射等.[泛型]\1* ...
- 反射(学习整理)----Class类和加载器ClassLoader类的整理
1.学习反射的时整理的笔记!Class类和ClassLoader类的简单介绍 反射机制中的Class Class内部到底有什么呢?看下图! 代码: Class cls=Person.class; .C ...
- JAVA异常处理、常用类、反射、集合
异常 异常:在Java中是指被一个方法抛出的对象. 分类:检查异常.运行时异常.错误 运行时异常(uncheckd):RuntimeException和其子类 检查异常(checkd/搜检异常):指E ...
- 反射方式,获取出集合ArrayList类的class文件对象
/* * 定义集合类,泛型String * 要求向集合中添加Integer类型 * * 反射方式,获取出集合ArrayList类的class文件对象 * 通过class文件对象,调用add方法 * * ...
- [Java反射基础四]通过反射了解集合泛型的本质
本文接上文"方法反射的基本操作",利用反射了解下java集合中泛型的本质 1.初始化两个集合,一个使用泛型,一个不使用 ArrayList list1 = new ArrayLis ...
- JavaSE基础复习---Class类与反射机制
---恢复内容开始--- 目录: 1.java.lang.class类 2.Java中的反射机制 3.运行时与编译时概念 1. java.lang.class类 Java程序在运行时,Java运行时系 ...
- Java常用类及反射,类加载
1.系统相关类 Java提供了System类和Runtime类来与程序运行的平台进行交互 A.System类代表当前Java程序的运行平台 a. System类是一个final类,该类的所有属性和方法 ...
- java--分析简单java类与反射的联系
分析简单java类与反射的联系 web对反射的操作支持 在JSP之中有一种技术--javaBean.而且在jsp里面也配套有相应的操作方式,javaBean的核心在于简单java类,于是下面演示此操作 ...
随机推荐
- 【爆料】-《堪培拉大学毕业证书》Canberra一模一样原件
☞堪培拉大学毕业证书[微/Q:2544033233◆WeChat:CC6669834]UC毕业证书/联系人Alice[查看点击百度快照查看][留信网学历认证&博士&硕士&海归& ...
- Twitter分布式自增ID算法snowflake原理解析
以JAVA为例 Twitter分布式自增ID算法snowflake,生成的是Long类型的id,一个Long类型占8个字节,每个字节占8比特,也就是说一个Long类型占64个比特(0和1). 那么一个 ...
- 死链接检查工具:Xenu 使用教程
一.软件作用 Xenu 全称Xenu’s Link Sleuth,是一款英文软件,界面单一,功能简单,使用方法很容易掌握.虽然看起来简单,但Xenu却拥有强大的功能.Xenu可以对网站的内链进行详细的 ...
- numpy C语言源代码调试(三)
鉴于ddd过于简陋,希望找一个新一些的调试工具,看到有很多人推荐gdbgui,这是一个非常新的调试工具,前端使用浏览器,现在采用这一架构的软件越来越多,可以完全不必依赖庞大的gui类库,安装使用比较方 ...
- c#Socket服务器与客户端的开发(2)
上一篇文章我们使用原生的socket分别实现了服务器和客户端, 本篇文章使用SuperSocket来开发实现服务器, 之前也介绍了SuperSocket是一个轻量级, 跨平台而且可扩展的 .Net/M ...
- 腾讯云存储专家深度解读基于Ceph对象存储的混合云机制
背景 毫无疑问,乘着云计算发展的东风,Ceph已经是当今最火热的软件定义存储开源项目.如下图所示,它在同一底层平台之上可以对外提供三种存储接口,分别是文件存储.对象存储以及块存储,本文主要关注的是对象 ...
- xamarin android如何将Java.Lang.Object类型转成C#类型
问题起源 其实这个标题也可以换一个更准确一点,因为我遇到的问题是: xamarin android中的Class继承了Java.Lang.Object ,将json序列化成c#类型时发现无法赋值,序列 ...
- 【招聘】.NET高级开发、前端高级开发、测试工程师
.NET架构师 工作地点:厦门-湖里区 工作年限:5年及以上 学历要求:大专或以上 工资范围:15000元 - 25000元 福利待遇:五险一金,带薪年休假,年度旅游,丰富的员工团队活动:生日会.中秋 ...
- USB总线标准
1.USB总线类型: OHCI(Open Host Controller Interface)是支持USB1.1的标准,但它不仅仅是针对USB,UHCI(Universal Host Controll ...
- 去除inline-block元素间的间距
一.现象描述 真正意义上的inline-block水平呈现的元素间,换行显示或者空格隔开的情况下会有间距,这是因为浏览器在解析时,会将换行等读取成一个空格导致. 二.移出空格的方法 ① 我们可以去掉元 ...