亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C#根據反射和特性實現ORM映射實例分析

2020-01-24 02:03:12
字體:
來源:轉載
供稿:網友

本文實例講述了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 空間。
特性的示例:

//描述數據庫字段的 Attributepublic 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#程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩国产中文精品字幕自在自线| 成人激情在线播放| 国产高清在线不卡| 狠狠色狠狠色综合日日小说| 精品亚洲一区二区三区在线播放| 不卡av在线播放| 欧美色另类天堂2015| 亚洲欧美中文字幕| 91精品久久久久久久久久久久久| 97成人精品视频在线观看| 亚洲国产成人久久| 亚洲精品成人久久电影| 日韩精品久久久久久久玫瑰园| 精品久久久久久久久中文字幕| 在线a欧美视频| 色婷婷亚洲mv天堂mv在影片| 欧美日韩精品在线观看| 亚洲欧美一区二区三区在线| 国产精品丝袜高跟| 亚洲性生活视频| 超薄丝袜一区二区| 成人免费视频xnxx.com| www欧美日韩| 精品国产一区二区三区久久| 欧美一区二区三区四区在线| 国产精品99久久久久久白浆小说| 欧美日韩成人精品| 国产日韩欧美在线看| 亚洲欧美国产高清va在线播| 国产精品wwwwww| 国产精品久久久久久久电影| 亚洲国产美女精品久久久久∴| 欧美午夜女人视频在线| 国产欧美日韩中文字幕| 国产精品91一区| 92看片淫黄大片欧美看国产片| 7777精品视频| 国产a∨精品一区二区三区不卡| 国产69精品久久久久9999| 国产一区二区丝袜| 国产乱人伦真实精品视频| 日韩高清电影免费观看完整版| 欧美专区国产专区| 久久久精品久久| 亚洲精品国产精品乱码不99按摩| 亚洲视频日韩精品| 久久全球大尺度高清视频| 欧美性生交xxxxx久久久| 日韩影视在线观看| 欧美视频在线观看免费| 第一福利永久视频精品| 国产情人节一区| 国产日韩在线看片| 日韩成人中文电影| 国产精品美女999| 亚洲成av人影院在线观看| 日韩在线观看免费全集电视剧网站| 精品视频久久久| 亚洲精选一区二区| 97免费中文视频在线观看| 亚洲综合视频1区| 久久久久久有精品国产| 亚洲精品白浆高清久久久久久| 久久露脸国产精品| 亚洲精品久久久一区二区三区| 国产精品自产拍在线观| 97超碰色婷婷| xvideos亚洲| 尤物九九久久国产精品的特点| 久久久久久高潮国产精品视| 欧美在线播放视频| 欧美性感美女h网站在线观看免费| 欧美国产日韩视频| 日本精品一区二区三区在线| 中日韩美女免费视频网址在线观看| 国产精品无av码在线观看| 久久精品一本久久99精品| 色婷婷综合久久久久中文字幕1| 色哟哟亚洲精品一区二区| 欧美日韩亚洲高清| 欧美天堂在线观看| 久久亚洲国产成人| 伊人久久久久久久久久久| 精品久久久久久久久久久久久久| 91久久精品国产| 91精品国产综合久久香蕉最新版| 日本三级久久久| 精品高清一区二区三区| 国产男人精品视频| 国产精品成人一区二区三区吃奶| 日韩av最新在线| 91精品国产自产在线观看永久| 亚洲欧美日韩精品久久亚洲区| 成人国产精品免费视频| 一本一本久久a久久精品综合小说| 国产美女直播视频一区| 一区二区三区国产在线观看| 国产精品日韩一区| 久久久久久12| 亚洲第一区在线观看| 久久久久久久久中文字幕| 综合网中文字幕| 亚洲国产天堂网精品网站| 91产国在线观看动作片喷水| 欧美中文在线字幕| 久久久国产精品一区| 欧美性xxxxx| 日韩精品中文字幕有码专区| 亚洲自拍小视频免费观看| 国产精品青草久久久久福利99| 午夜精品蜜臀一区二区三区免费| 久久精品青青大伊人av| 欧美性感美女h网站在线观看免费| 亚洲成人网在线| 欧洲美女免费图片一区| 国产精品第二页| 91国产高清在线| 国产精品久久久久久亚洲影视| 久久精品在线播放| 精品夜色国产国偷在线| 欧美成人精品三级在线观看| 性色av一区二区三区| 欧美激情日韩图片| 97国产真实伦对白精彩视频8| 国产精品日韩精品| 国产69久久精品成人看| 91在线免费看网站| 欧美在线视频在线播放完整版免费观看| 日韩资源在线观看| 欧美视频国产精品| 清纯唯美亚洲综合| 成人中心免费视频| 亚洲精品美女在线观看| 欧美影院成年免费版| 中文字幕免费精品一区| 97超级碰碰碰| 国产精品久久一区| 欧美性猛交xxxx黑人猛交| 久久精品国产亚洲一区二区| 国产精品视频免费在线观看| 国产精品偷伦免费视频观看的| 欧美色视频日本版| 日韩中文字幕免费视频| 日韩av在线免费观看一区| 欧美激情综合色综合啪啪五月| 欧美国产日韩在线| 成人有码视频在线播放| 青青草原成人在线视频| 欧美尺度大的性做爰视频| 亚洲精品久久久一区二区三区| 国产精品va在线播放我和闺蜜| 欧美国产激情18| 午夜精品理论片| 在线免费看av不卡| 国产99久久精品一区二区| 亚洲精品日韩激情在线电影| 精品国产自在精品国产浪潮| 韩国欧美亚洲国产| 91免费版网站入口| 91精品免费久久久久久久久| 久久久电影免费观看完整版| 亚洲影影院av| 久久影视免费观看| 亚洲激情视频在线播放|