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

(一)关于反射

什么是反射?

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

反射的作用?

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

反射的示例:

  1. using System;
  2. using System.Reflection;
  3. namespace CS_Test
  4. {
  5. public class MyStudent
  6. {
  7. private string sName;
  8. public string SName
  9. {
  10. get { return sName; }
  11. set { sName = value; }
  12. }
  13. private int sAge;
  14. public int SAge
  15. {
  16. get { return sAge; }
  17. set { sAge = value; }
  18. }
  19. }
  20. class Test_Attribute
  21. {
  22. [STAThread]
  23. static void Main(string[] args)
  24. {
  25. MyStudent stu1 = new MyStudent();
  26. stu1.SName = "刘德华";
  27. stu1.SAge = ;
  28. // 获得所有属性
  29. PropertyInfo[] pros = stu1.GetType().GetProperties();
  30. // 显示所有属性值
  31. foreach (PropertyInfo pro in pros)
  32. Console.WriteLine(pro.Name+":"+pro.GetValue(stu1,null));
  33. //更改stu1对象的SAge值
  34. stu1.GetType().GetProperty("SAge").SetValue(stu1, , null);
  35. // 显示所有属性值
  36. foreach (PropertyInfo pro in pros)
  37. Console.WriteLine(pro.Name+":"+pro.GetValue(stu1, null));
  38. }
  39. }
  40. }

(二)关于特性

什么是 Attribute?

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

注意:

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

  1. //描述数据库字段的 Attribute
  2. public class DataFieldAttribute : Attribute
  3. {
  4. public DataFieldAttribute(string fieldName,string fieldType)
  5. {
  6. this._fieldName = fieldName;
  7. this._fieldType = fieldType;
  8. }
  9. // 数据库字段名
  10. private string _fieldName;
  11. public string FieldName
  12. {
  13. get { return _fieldName; }
  14. set { _fieldName = value; }
  15. }
  16. // 数据库字段类型
  17. private string _fieldType;
  18. public string FieldType
  19. {
  20. get { return _fieldType; }
  21. set { _fieldType = value; }
  22. }
  23. }

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

  1. public class MyStudent
  2. {
  3. private string _name;
  4. //使用“特性”描述对应的数据库字段名、类型
  5. [DataFieldAttribute("SName", "varchar")]
  6. public string Name
  7. {
  8. get { return _name; }
  9. set { _name = value; }
  10. }
  11. private int _age;
  12. [DataFieldAttribute("SAge", "int")]
  13. public int Age
  14. {
  15. get { return _age; }
  16. set { _age = value; }
  17. }
  18. }

(三)ORM 映射规则的定义

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

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

显示结果:

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

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

完整代码如下:

  1. using System;
  2. using System.Reflection;
  3. namespace CS_Test
  4. {
  5. public class MyStudent
  6. {
  7. private string _name;
  8. //使用“特性”描述对应的数据库字段名、类型
  9. [DataFieldAttribute("SName", "varchar")]
  10. public string Name
  11. {
  12. get { return _name; }
  13. set { _name = value; }
  14. }
  15. private int _age;
  16. [DataFieldAttribute("SAge", "int")]
  17. public int Age
  18. {
  19. get { return _age; }
  20. set { _age = value; }
  21. }
  22. }
  23. //描述数据库字段的 Attribute
  24. public class DataFieldAttribute : Attribute
  25. {
  26. public DataFieldAttribute(string fieldName,string fieldType)
  27. {
  28. this._fieldName = fieldName;
  29. this._fieldType = fieldType;
  30. }
  31. // 数据库字段名
  32. private string _fieldName;
  33. public string FieldName
  34. {
  35. get { return _fieldName; }
  36. set { _fieldName = value; }
  37. }
  38. // 数据库字段类型
  39. private string _fieldType;
  40. public string FieldType
  41. {
  42. get { return _fieldType; }
  43. set { _fieldType = value; }
  44. }
  45. }
  46. class Test_Attribute
  47. {
  48. [STAThread]
  49. static void Main(string[] args)
  50. {
  51. MyStudent stu1 = new MyStudent();
  52. stu1.Name = "刘德华";
  53. stu1.Age = ;
  54. // 获得所有属性
  55. PropertyInfo[] pros = stu1.GetType().GetProperties();
  56. // 显示所有属性值
  57. foreach (PropertyInfo pro in pros)
  58. Console.WriteLine(pro.Name+":"+pro.GetValue(stu1,null));
  59. //更改stu1对象的SAge值
  60. stu1.GetType().GetProperty("Age").SetValue(stu1, , null);
  61. // 显示所有属性值
  62. foreach (PropertyInfo pro in pros)
  63. Console.WriteLine(pro.Name+":"+pro.GetValue(stu1, null));
  64.  
  65. //通过反射的方法来动态获取此映射规则
  66. PropertyInfo[] infos = stu1.GetType().GetProperties();
  67. object[] objs_fieldAttr = null;
  68. foreach (PropertyInfo info in infos)
  69. {
  70. // GetCustomAttributes:
  71. // 返回实体中每个属性对应的“特性”信息(数据库字段名、类型)
  72. objs_fieldAttr = info.GetCustomAttributes(
  73. typeof(DataFieldAttribute), false);
  74. if (objs_fieldAttr != null)
  75. {
  76. Console.Write("实体类的属性名:" + info.Name);
  77. Console.Write(" -> 数据库字段名:");
  78. Console.WriteLine(((DataFieldAttribute)objs_fieldAttr[]).FieldName);
  79. }
  80. }
  81. }
  82. }
  83. }

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. Fakeapp 入门教程(3):参数篇

    参数可以让软件自由度更高.Fakeapp的参数并不算多,但是也非常使用.本文就讲解下几个重要的参数.参数设置界面可以通过点击SETTINGS打开. 参数修改无需点击保存,一旦修改直接生效. Proce ...

  2. JZOJ 4307. 喝喝喝

    Description

  3. Oracle 数据库密码过期问题

    (1)在CMD命令窗口中输入:           sqlplus 用户名/密码@数据库本地服务名 as sysdba;(如:sqlplus scott/1234@oracle1 as sysdba; ...

  4. Python中的正则

    regex_lst = [ ('字符组',), ('非打印字符',), ('特殊字符',), ('定位符',), ('限定符',), ('re模块',), ('分组命名',), ('或匹配',), ( ...

  5. 添加SQL字段

    通用式: alter table [表名] add [字段名] 字段属性 default 缺省值 default 是可选参数增加字段: alter table [表名] add 字段名 smallin ...

  6. 【Remove Duplicates from Sorted List II 】cpp

    题目: Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct  ...

  7. 【Search In Rotated Sorted Array】cpp

    题目: Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7  ...

  8. SEO搜索引擎优化基础

    要如何提高自己网站的知名度,那必须了解一些SEO知识. 1.什么是搜索引擎 所谓的搜索引擎(Search  Engines)是一些能够主动搜索信息(搜索网页上的单词和简短的特定的内容描述)并将其自动索 ...

  9. MYSQL学习心得(转)

    适合有SQL SERVER或ORACLE基础的人看,有对比,学习更有效果 转自:http://www.cnblogs.com/lyhabc/ 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习 ...

  10. 【转】超简单利用UGUI制作圆形小地图

    http://sanwen.net/a/ithhtbo.html 由于UI都是Achor自己用PS做的,比较粗糙,大家见谅,不过丝毫不影响功能的实现,下面我们看看今天的笔记: 首先我们看看需要哪些组件 ...