本文实例讲述了C#根据反射和特性实现ORM 映射的方法。分享给大家供大家参考。具体如下:

(一)关于反射

什么是反射?

反射就是在运行时,动态获取对象信息的方法。比如:运行时获得对象有哪些属性,方法,委托等。

反射的作用?

能够实现运行时,动态调用对象的方法,以及动态设置、获取属性值等。

反射的示例:

using System;
using System.Reflection;
namespace CS_Test
{
public class MyStudent
{
private string sName;
public string SName
{
get { return sName; }
set { sName = value; }
}
private int sAge;
public int SAge
{
get { return sAge; }
set { sAge = value; }
}
}
class Test_Attribute
{
[STAThread]
static void Main(string[] args)
{
MyStudent stu1 = new MyStudent();
stu1.SName = "刘德华";
stu1.SAge = ;
// 获得所有属性
PropertyInfo[] pros = stu1.GetType().GetProperties();
// 显示所有属性值
foreach (PropertyInfo pro in pros)
Console.WriteLine(pro.Name+":"+pro.GetValue(stu1,null));
//更改stu1对象的SAge值
stu1.GetType().GetProperty("SAge").SetValue(stu1, , null);
// 显示所有属性值
foreach (PropertyInfo pro in pros)
Console.WriteLine(pro.Name+":"+pro.GetValue(stu1, null));
}
}
}

(二)关于特性

什么是 Attribute?

它是对运行时的对象或对象的属性、方法、委托等进行描述的类。
Attribute 的作用?
用于在运行时,描述你的代码或者影响你的程序的行为。

注意:

既然Attribute 是类,那么它的定义与定义类一样。
唯一不同的就是,自定义Attribute 类必须继承于System.Attribute 空间。
特性的示例:

//描述数据库字段的 Attribute
public class DataFieldAttribute : Attribute
{
public DataFieldAttribute(string fieldName,string fieldType)
{
this._fieldName = fieldName;
this._fieldType = fieldType;
}
// 数据库字段名
private string _fieldName;
public string FieldName
{
get { return _fieldName; }
set { _fieldName = value; }
}
// 数据库字段类型
private string _fieldType;
public string FieldType
{
get { return _fieldType; }
set { _fieldType = value; }
}
}

通过自定义Attribute,我们定义了类属性和数据库字段的一一对应关系,于是对MyStudent 类的Name、Age 属性都加上Attribute 的描述,指定他们对应的数据库字段名以及类型。
代码更改如下:

public class MyStudent
{
private string _name;
//使用“特性”描述对应的数据库字段名、类型
[DataFieldAttribute("SName", "varchar")]
public string Name
{
get { return _name; }
set { _name = value; }
}
private int _age;
[DataFieldAttribute("SAge", "int")]
public int Age
{
get { return _age; }
set { _age = value; }
}
}

(三)ORM 映射规则的定义

给实体类增加DataFieldAttribute 的描述,其实就是增加了O(对象)/ R(关系数据库)的映射规则。
下面我们就通过反射的方法实现:在运行时动态获取O/R  Mapping 的映射规则:

static void Main(string[] args)
{
MyStudent stu1 = new MyStudent();
stu1.Name = "刘德华";
stu1.Age = ;
//通过反射的方法来动态获取此映射规则
PropertyInfo[] infos = stu1.GetType().GetProperties();
object[] objs_fieldAttr = null;
foreach (PropertyInfo info in infos)
{
// GetCustomAttributes:
// 返回实体对象中每个属性对应的“特性”信息(数据库字段名、类型)
objs_fieldAttr = info.GetCustomAttributes(
typeof(DataFieldAttribute), false);
if (objs_fieldAttr != null)
{
Console.Write("实体类的属性名:" + info.Name);
Console.Write(" -> 数据库字段名:");
Console.WriteLine(((DataFieldAttribute)objs_fieldAttr[]).FieldName);
}
}
}

显示结果:

实体类的属性名:Name -> 数据库字段名:SName
实体类的属性名:Age -> 数据库字段名:SAge
 
接下来的工作就是:怎样根据这种方法动态地从对象中获取映射规则,然后动态构造Insert、Update、Delete 等 SQL 语句。这就是实现自己的ORM 的原理。
 
这里的代码仅仅是举例,而要真正实现一个ORM,我们还需要考虑的很多,比如:

1、实体类对应于哪张数据库表?
2、数据库表中的 PK  和 FK(如果有的话)怎么表示?

完整代码如下:

using System;
using System.Reflection;
namespace CS_Test
{
public class MyStudent
{
private string _name;
//使用“特性”描述对应的数据库字段名、类型
[DataFieldAttribute("SName", "varchar")]
public string Name
{
get { return _name; }
set { _name = value; }
}
private int _age;
[DataFieldAttribute("SAge", "int")]
public int Age
{
get { return _age; }
set { _age = value; }
}
}
//描述数据库字段的 Attribute
public class DataFieldAttribute : Attribute
{
public DataFieldAttribute(string fieldName,string fieldType)
{
this._fieldName = fieldName;
this._fieldType = fieldType;
}
// 数据库字段名
private string _fieldName;
public string FieldName
{
get { return _fieldName; }
set { _fieldName = value; }
}
// 数据库字段类型
private string _fieldType;
public string FieldType
{
get { return _fieldType; }
set { _fieldType = value; }
}
}
class Test_Attribute
{
[STAThread]
static void Main(string[] args)
{
MyStudent stu1 = new MyStudent();
stu1.Name = "刘德华";
stu1.Age = ;
// 获得所有属性
PropertyInfo[] pros = stu1.GetType().GetProperties();
// 显示所有属性值
foreach (PropertyInfo pro in pros)
Console.WriteLine(pro.Name+":"+pro.GetValue(stu1,null));
//更改stu1对象的SAge值
stu1.GetType().GetProperty("Age").SetValue(stu1, , null);
// 显示所有属性值
foreach (PropertyInfo pro in pros)
Console.WriteLine(pro.Name+":"+pro.GetValue(stu1, null)); //通过反射的方法来动态获取此映射规则
PropertyInfo[] infos = stu1.GetType().GetProperties();
object[] objs_fieldAttr = null;
foreach (PropertyInfo info in infos)
{
// GetCustomAttributes:
// 返回实体中每个属性对应的“特性”信息(数据库字段名、类型)
objs_fieldAttr = info.GetCustomAttributes(
typeof(DataFieldAttribute), false);
if (objs_fieldAttr != null)
{
Console.Write("实体类的属性名:" + info.Name);
Console.Write(" -> 数据库字段名:");
Console.WriteLine(((DataFieldAttribute)objs_fieldAttr[]).FieldName);
}
}
}
}
}

C#根据反射和特性实现ORM映射实例分析的更多相关文章

  1. Hibernate使用注解进行ORM映射实例

    在上一篇博客中,我们通过xml配置文件进行实体类和表的映射,但是近两年来有更多的项目对一些比较稳定的实体类使用了注解进行ORM映射,这样使得编程更加简洁.简单.其实使用注解进行ORM映射和使用xml进 ...

  2. linux kernel内存映射实例分析

    作者:JHJ(jianghuijun211@gmail.com)日期:2012/08/24 欢迎转载,请注明出处 引子 现在android智能手机市场异常火热,硬件升级非常迅猛,arm cortex ...

  3. 利用抽象、多态实现无反射的绿色环保ORM框架

    最近一直在忙新公司的基础库建设,对系统架构.开发框架及快速开发平台的设计实施都积累了一定的实践经验. 一般的中小型的软件开发公司,如果按照技术储备来衡量软件项目的技术含量的评定依据是可行的.但如果光是 ...

  4. C#反射与特性(七):自定义特性以及应用

    目录 1,属性字段的赋值和读值 2,自定义特性和特性查找 2.1 特性规范和自定义特性 2.2 检索特性 3,设计一个数据验证工具 3.1 定义抽象验证特性类 3.2 实现多个自定义验证特性 3.3 ...

  5. C#基础系列:实现自己的ORM(反射以及Attribute在ORM中的应用)

    反射以及Attribute在ORM中的应用 一. 反射什么是反射?简单点吧,反射就是在运行时动态获取对象信息的方法,比如运行时知道对象有哪些属性,方法,委托等等等等.反射有什么用呢?反射不但让你在运行 ...

  6. 十七、C# 反射、特性和动态编程

    反射.特性和动态编程   1.访问元数据 2.成员调用 3.泛型上的反射 4.自定义特性 5.特性构造器 6.具名参数 7.预定义特性 8.动态编程   特性(attribute)是在一个程序集中插入 ...

  7. 点评阿里JAVA手册之MySQL数据库 (建表规约、索引规约、SQL语句、ORM映射)

    下载原版阿里JAVA开发手册  [阿里巴巴Java开发手册v1.2.0] 本文主要是对照阿里开发手册,注释自己在工作中运用情况. 本文内容:MySQL数据库 (建表规约.索引规约.SQL语句.ORM映 ...

  8. C#反射与特性使用简介

    本文是学习特性与反射的学习笔记,在介绍完特性和反射之后,会使用特性与反射实现一个简单的将DataTable转换为List的功能,水平有限,如有错误,还请大神不吝赐教. 1.      反射:什么是反射 ...

  9. .NET基础拾遗(4)委托、事件、反射与特性

    Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...

随机推荐

  1. 笔记1 python入门学习笔记

    目录 官方手册 菜鸟站手册地址: python的运行方法 注释 小技巧: input()接收用户输入的内容(默认为字符串) print() 运算符 is 是判断两个标识符是不是引用自一个对象 all和 ...

  2. 一个手机号可以注册绑定5个百度网盘,永久2T

    效果: 一个手机号可以注册绑定5个百度网盘,得永久2T硬盘 手机号只能做为其中一个网盘的登陆账号,其它四个用绑定qq登陆(微信应该也可以). 条件: 2个手机号:A(用来绑定百度网盘),B(用来申请网 ...

  3. MySQL之体系结构与存储实例

    定义数据库和实例 在数据库领域中有两个词很容易混淆,这就是“数据库”(database)和“实例”(instance).作为常见的数据库术语,这两个词的定义如下: 数据库:物理操作系统文件或其他形式文 ...

  4. Vs2012 打开项目 自动关闭 并停止工作 解决方法

    来源:http://q.cnblogs.com/q/52530/ http://www.microsoft.com/zh-cn/download/details.aspx?id=36020 下载并安装 ...

  5. 42、通过ontouch检测expandableListview的单击、长按、列表滚动

    一.在model定义变量: public boolean isExpandableListviewScroll = false;//这个是 首先监听expandableListview的滚动: Exp ...

  6. 【Word Break】cpp

    题目: Given a string s and a dictionary of words dict, determine if s can be segmented into a space-se ...

  7. Effictive C++ 学习记录

    这是前段时间看的书,整理到这里吧,以后查看也方便. 这些条款需要反复查看. 条款01:视C++为一个语言联邦 条款02:尽量用const.enum.inline替换#define 条款03:尽可能的使 ...

  8. chrome浏览器设置自动切换代理上网的方法

    利用shadowsocks代理软件实现FQ时,如果都走代理模式,流量肯定不够.可以利用chrome的SwitchyOmega插件实现自动根据URL来决定是否使用代理.设置如下: 1.安装Switchy ...

  9. Python学习-day10(番外篇) 阻塞IO 非阻塞IO 同步IO 异步IO

    这个章节的内容是关于IO的概念,谈一谈什么是 阻塞IO 非阻塞IO 同步IO 异步IO.以下摘要是我对这四种IO的一个形象理解. 场景是去去银行办理业务.节点有三个,1)到银行提交申请:2)取号:3) ...

  10. hnust CZJ-Superman

    问题 B: CZJ-Superman 时间限制: 1 Sec  内存限制: 128 MB提交: 636  解决: 87[提交][状态][讨论版] 题目描述 “那是只鸟?那是飞机?那是——超人!” 程序 ...