C#根据反射和特性实现ORM映射实例分析
本文实例讲述了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 = 40; // 获得所有属性 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, 30, 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 = 40; //通过反射的方法来动态获取此映射规则 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[0]).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 = 40; // 获得所有属性 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, 30, 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[0]).FieldName); } } } } }
希望本文所述对大家的C#程序设计有所帮助。
相关文章
- 我们在使用C#做项目的时候,基本上都需要制作登录界面,那么今天我们就来一步步看看,如果简单的实现登录界面呢,本文给出2个例子,由简入难,希望大家能够喜欢。...2020-06-25
- 这篇文章主要介绍了C# 字段和属性的的相关资料,文中示例代码非常详细,供大家参考和学习,感兴趣的朋友可以了解下...2020-11-03
- 这篇文章主要介绍了C#中截取字符串的的基本方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-03
- 这篇文章主要介绍了C#实现简单的Http请求的方法,以实例形式较为详细的分析了C#实现Http请求的具体方法,需要的朋友可以参考下...2020-06-25
- 本文给大家分享C#连接SQL数据库和查询数据功能的操作技巧,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友参考下吧...2021-05-17
- 本文主要介绍了C#中new的几种用法,具有很好的参考价值,下面跟着小编一起来看下吧...2020-06-25
使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序)
这篇文章主要介绍了使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25- 这篇文章主要介绍了C#开发Windows窗体应用程序的简单操作步骤,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-12
- 这篇文章主要介绍了C#从数据库读取图片并保存的方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...2021-01-16
- 最近做一个小项目不可避免的需要前端脚本与后台进行交互。由于是在asp.net中实现,故问题演化成asp.net中jiavascript与后台c#如何进行交互。...2020-06-25
- 本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
- 轻松学习C#的基础入门,了解C#最基本的知识点,C#是一种简洁的,类型安全的一种完全面向对象的开发语言,是Microsoft专门基于.NET Framework平台开发的而量身定做的高级程序设计语言,需要的朋友可以参考下...2020-06-25
- 本文主要介绍了C#变量命名规则小结,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-09
- 这篇文章主要介绍了C#绘制曲线图的方法,以完整实例形式较为详细的分析了C#进行曲线绘制的具体步骤与相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
- 本文主要介绍了C# 中取绝对值的函数。具有很好的参考价值。下面跟着小编一起来看下吧...2020-06-25
- 这篇文章主要介绍了c#自带缓存使用方法,包括获取数据缓存、设置数据缓存、移除指定数据缓存等方法,需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了c#中(&&,||)与(&,|)的区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
- 这篇文章主要用实例讲解C#递归算法的概念以及用法,文中代码非常详细,帮助大家更好的参考和学习,感兴趣的朋友可以了解下...2020-06-25
- 下面小编就为大家带来一篇C#学习笔记- 随机函数Random()的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
- 这篇文章主要介绍了C#中list用法,结合实例形式分析了C#中list排序、运算、转换等常见操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25