C# 通过反射初探ORM框架的实现原理
背景:
以前学的Java进行开发,多用到Mybatis,Hiberante等ORM框架,最近需要上手一个C#的项目,由于不是特别难,也不想再去学习C#的ORM框架,所以就想着用反射简单的实现一下ORM框架的内容,简单的增删改查,没有用到多表之间的联系。
反射:
Java和C#中的反射大体相同,主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。我的理解就是可以程序运行时动态的获取对象的属性和方法,并且可以进行与之相关的调用。
首先看一下C#中反射实现方式:
获取Type对象,反射操作都需要通过Type对象来进行。
通过全限定名来获取 Type tp = Type.GetType("TJCommon.Dao.Deriver");
通过类来获取 Type tp = typeof(Int)
获取到Type对象后我们可以通过其构造方法来创建对象
调用无参构造
// 获取类的初始化构造信息
ConstructorInfo ct = tp.GetConstructor(System.Type.EmptyTypes);
// 调用不带参数的构造器
T newObj = (T)ct.Invoke(null);
调用有参构造
//定义参数类型数组
Type[] tps = new Type[];
tps[] = typeof(int);
tps[] = typeof(string);
//获取类的初始化参数信息
ConstructorInfo ct2 = tp.GetConstructor(tps); //定义参数数组
object[] obj = new object[];
obj[] = (object);
obj[] = (object)"Param Example"; //调用带参数的构造器
ExampleClass Ex2 = (ExampleClass)ct2.Invoke(obj);
获得所有公共字段
// 获取到所有公共字段
FieldInfo[] arr = t.GetFields();
// 给指定的字段赋值 需要传递进来一个对象 newObj
f.SetValue(newObj, r[name]);
这里就介绍这几个方法,通过反射可以获得类中的所有信息,并且可以进行调用,还可以打破封装(不安全)
练习
下面就是通过反射将从数据库中获取到的结果集自动封装到Bean中。无需手动封装
public static T dataToObj(String str)
{ String strSql = str;
DataSet ds = SqlCompose.ExecuteSqlQuery(strSql); Type t = typeof(T);
DataRow r = ds.Tables[].Rows[]; // 找到一行
FieldInfo[] arr = t.GetFields(); // 返回所有公共字段(public)
ConstructorInfo ct = t.GetConstructor(System.Type.EmptyTypes);
T newObj = (T)ct.Invoke(null);
if (r != null)
{
foreach (FieldInfo f in arr)// 遍历所有字段
{
string name = f.Name;
Type type2 = f.FieldType;
if (r[name].GetType() != typeof(DBNull))
{
string typeName = f.FieldType.Name;
f.SetValue(newObj, r[name]);
}
}
}
else
{
newObj = default(T);
}
ds.Tables.Clear(); return newObj;
}
封装到List
public static List<T> dataToList(String str)
{
List<T> list = new List<T>(); String strSql = str;
DataSet ds = SqlCompose.ExecuteSqlQuery(strSql); Type t = typeof(T);
FieldInfo[] arr = t.GetFields(); // 返回所有公共字段(public)
ConstructorInfo ct = t.GetConstructor(System.Type.EmptyTypes); foreach (DataRow dr in ds.Tables[].Rows)
{
T newObj = (T)ct.Invoke(null);
foreach (FieldInfo f in arr)// 遍历所有字段
{
string name = f.Name;
Type type2 = f.FieldType;
string typeName = f.FieldType.Name;
if (dr[name].GetType() != typeof(DBNull))
{
f.SetValue(newObj, dr[name]);
} } list.Add(newObj); }
ds.Tables.Clear();
return list; }
拼接字符串进行insert操作
public static void inserByBean(string tableName, T target)
{ StringBuilder sql = new StringBuilder(); // 拼接的sql sql.Append("insert into "+tableName+"("); Type t = target.GetType();
PropertyInfo[] ps = t.GetProperties(); for (int i = ; i < ps.Length; i++)
{ object obj = ps[i].GetValue(target, null);
if (obj != null)
{
string name = ps[i].Name;
if (i != ps.Length - )
{
sql.Append(" " + name + ",");
}
else
{
sql.Append(" " + name + "");
}
}
} sql.Append(") values("); for (int i = ; i < ps.Length; i++)
{
object obj = ps[i].GetValue(target, null); if (obj != null)
{
if (i != ps.Length - )
{
if (ps[i].PropertyType == typeof(string) || ps[i].PropertyType == typeof(DateTime))
{
sql.Append("'" + obj + "',");
}
else {
sql.Append("" + obj + ",");
}
}
else
{
if (ps[i].PropertyType == typeof(string) || ps[i].PropertyType == typeof(DateTime))
{
sql.Append("'" + obj + "')");
}
else
{
sql.Append("" + obj + ")");
}
}
}
}
string resultSql = sql.ToString();
SqlCompose.ExecuteSqlNonQuery(resultSql);
}
C# 通过反射初探ORM框架的实现原理的更多相关文章
- 利用反射搭建orm框架
1思路 根据java反射获取属性上的 注解的value的值 然后拼接成sql去执行 这就是完成了一个orm实体关系映射 package src.Test.Reflect;import java.lan ...
- 利用抽象、多态实现无反射的绿色环保ORM框架
最近一直在忙新公司的基础库建设,对系统架构.开发框架及快速开发平台的设计实施都积累了一定的实践经验. 一般的中小型的软件开发公司,如果按照技术储备来衡量软件项目的技术含量的评定依据是可行的.但如果光是 ...
- Android轻量级ORM框架ActiveAndroid入门教程(转)
注:没有找到出处,如有侵犯,请告知 开始ActiveAndroid神奇之旅: 在AndroidManifest.xml中我们需要添加这两个 AA_DB_NAME (数据库名称,这个name不能改,但是 ...
- “造轮运动”之 ORM框架系列(三)~ 干货呈上
这一趴里面,我就来正式介绍一下CoffeeSQL的干货. 首先要给CoffeeSQL来个定位:最开始就是由于本人想要了解ORM框架内部的原理,所以就四处搜寻有关的博客与学习资料,就是在那个夏天 ...
- 【EF 4】ORM框架及其流行产品之一EF介绍
导读:跳进了多租户切换数据库的坑,那么就继续走下去吧.在我们的项目中,是运用EF实现对数据库的操作,那么EF其实是.NET系统中,基于ORM框架的一个产品实现.在java那边,则有Hibernate和 ...
- Mego(2) - NET主流ORM框架分析
接上文我们测试了各个ORM框架的性能,大家可以很直观的看到各个ORM框架与原生的ADO.NET在境删改查的性能差异.这里和大家分享下我对ORM框架的理解及一些使用经验. ORM框架工作原理 典型ORM ...
- ORM框架通过映射(反射)获取数据库的数据
ORM(Object Relational Mapping)框架采用元数据来描述对象一关系映射细节,元数据一般采用XML格式,并且存放在专门的对象一映射文件中.只要提供了持久化类与表的映射关系,ORM ...
- c#自定义ORM框架---(泛型&反射&实体类扩展属性<附带通用增、删、查、改>)
该教材主要是运用到泛型.反射和实体类扩展属性 步骤一.建立扩展属性类 实体类扩展属性要继承Attribute基类完成 [AttributeUsage(AttributeTargets.Property ...
- 轻量级ORM框架初探-Dapper与PetaPoco的基本使用
一.EntityFramework EF是传统的ORM框架,也是一个比较重量级的ORM框架.这里仍然使用EF的原因在于为了突出轻量级ORM框架的性能,所谓有对比才有更优的选择. 1.1 准备一张数据库 ...
随机推荐
- 聊聊 Material Design 里,阴影的那些事儿!
当你的设计师要求你在某个 View 上增加阴影效果,那你只需要认真阅读本文,阴影的问题就不再是问题. 一.前言 设计师的世界,与常人不同,有时候想要扁平化的风格,有时候又想要拟物化的风格.而在 Mat ...
- openCV中直方图均衡化算法的理解
直方图均衡化就是调整灰度直方图的分布,即将原图中的灰度值映射为一个新的值.映射的结果直观表现是灰度图的分布变得均匀,从0到255都有分布,不像原图那样集中.图像上的表现就是对比度变大,亮的更亮,暗的更 ...
- 有关CUBLAS中的矩阵乘法函数
关于cuBLAS库中矩阵乘法相关的函数及其输入输出进行详细讨论. ▶ 涨姿势: ● cuBLAS中能用于运算矩阵乘法的函数有4个,分别是 cublasSgemm(单精度实数).cublasDgemm( ...
- ⑧bootstrap组件 文字图片 下拉菜单 按钮组 使用基础案例
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- java设计师初入职场,如何站稳脚跟
本文内容一共由3部分展开 a:新人如何快速融入团队 b:如何在职场中提升自己影响力 c:如何规进行职业规划 a:如何快速融入团队 能在层层选拔下进入公司,说明你工作的能力还是得到公司的认可,不过这 ...
- Js的闭包,这篇写的是比较清晰明了的
一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量 ...
- 掌握numpy(四)
数组的累加(拼接) 在前面讲了使用切片方法能够对数组进行切分,使用copy对切片的数组进行复制,那么数组该如何拼接呢? a1 = np.full((2,3),1)#填充数组 a2 = np.full( ...
- 【python】python中 简单的 glob模块
glob模块是最简单的模块之一,内容非常少.用它可以查找符合特定规则的文件路径名.跟使用windows下的文件搜索差不多.查找文件只用到三个匹配符:"*", "?&quo ...
- MySQL解压版配置步骤详细教程
解压mysql到D盘根目录 在解压路径下复制my-default.ini,修改名称为my.ini 在my.ini内容如下 [client]default-character-set=utf8 [mys ...
- RabbitMQ和SpringBoot的简单整合列子
一 思路总结 1 主要用spring-boot-starter-amqp来整合RabbitMQ和SpringBoot 2 使用spring-boot-starter-test来进行单元测试 3编写配置 ...