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

首頁 > 學院 > 開發設計 > 正文

[.net面向對象程序設計進階](20)反射(Reflection)(上)利用反射技術實現動態編程

2019-11-14 14:27:27
字體:
來源:轉載
供稿:網友

[.net 面向對象程序設計進階] (20) 反射(Reflection)(上)利用反射技術實現動態編程

本節導讀:本節主要介紹什么是.NET反射特性,.NET反射能為我們做些什么,最后介紹幾種常用的反射的實現方法,通過對反射性特的了解,可以設計出非常有用的基于反射的編程模式。

讀前必備:

[.net 面向對象編程基礎]  (10) 類的成員(字段、屬性、方法)

1.什么是.NET反射?

反射是.NET一個重要的特性,《CLR via C#》一書中對.NET反射的解釋為:在我們應用程序中使用元數據來表示存儲。編譯程序集或模塊時,編譯器會創建一個類型定義表、一個字段定義表、一個方法定義表以及其它表。而我們如果想動態調用這些元數據表(或說是解析這些表),或說是為這些元數據創建一個對象模型,這個過程就是反射。

簡單通俗的說,就是動態調用編譯過的程序集中的屬性,字段,方法等的過程,就是反射。

反射在.NET,通過System.Reflection命名空間中的類來實現。

2.反射能為我們做些什么?

這個問題是我們學習反射的重點,總得知道學習它的好處,才會繼續把本文看下去。

反射特性,確實是.NET一個非常重要且有用的特性。

A.枚舉類型成員

B.實例化新對象

C.執行對象成員

D.查找類型信息

E.查詢程序集信息

F.檢查應用于某種類型的自定義特性

G.創建和編譯新的程序集

H.簡化執行時而非編譯時綁定的數據的操作。(C# 4.0以后新功能)

此外.NET新版本中允許泛型上的反射.

以上是反射的基本特性,參考了《C#本質論》和《C#高級編程》

基于上面的基本特性,我們可以設計出很多非常實用的編程模式。

下面列舉幾種基于反射設計模式下的實例:

A.利用反射創動態創建程序集的API文檔?;诜瓷湓试S枚舉程序集中類型及成員的特性,我們可以通過反射獲取已編譯的程序集中的字段方法屬性事件和他們的xml注釋。從而動態創建程序集的API文檔;

B.非常常用的反射工廠模式。反射工廠模式在設計模式中比較容易理解,也比較簡單。很多代碼生成器中就利用這種設計模式完成不同數據庫的反射調用。比如我們有MsSql、MySQL、Oracle這三種數據庫,在項目設計中,我們有可能隨時換另一種數據庫(當然這只是假設),因此需要同時實現這三種數據庫的基礎增刪改查的類即數據訪問類。我們要切換數據庫的時候,只需要在config中更改數據庫類型,其他的工作交給反射工廠類去動態調用編譯好的程序集中對應的數據庫訪問方法。

如果沒有理解也沒關系,這里只是說明一下反射的應用實例,以便于更有信心的學習反射。反射在設計模式中的應還有很多,這里不再列舉。

3.反射應用基礎

上面說了這么多,無非就是先讓我們理解反射能為我們做些什么,下面進入正題,說一下反射的代碼實現。

     下面主要介紹反射的核心類及類成員

     反射的命名空間:System.Reflection

     反射的類大多都在這個命名空間中。

     主要的類: System.Type 

     這個類是反射的核心,其屬性方法可以得到運行時的信息。

    Type類派生于System.Reflection.MemberInfo抽象類    

MemberInfo類中的只讀屬性

屬性

描述

備注

Type DeclaringType

獲取聲明該成員的類或接口的類型

 

MemberTypes  MemberType

獲取成員的類型,這個值用于指示該成員是字段、方法、屬性、事件、或構造函數

這是一個枚舉,它定義了用于表示不同成員的類型值。這些值包括:MemberTypes.Constructor,   MemberTypes.Method,      MemberTypes.Field,        MemberTypes.Event,      MemberTypes.PRoperty。因此可以通過檢查MemberType屬性來確定成員的類型,例如,在MemberType屬性的值為MemberTypes.Method時,該成員為方法

Int MetadataToken

獲取與特定元數據相關的值

 

Module Module

獲取一個代表反射類型所在模塊(可執行文件)的Module對象

 

String  Name

成員的名稱

 

Type  ReflectedType

反射的對象類型

 

  

Type類的只讀屬性

屬性

描述

Assembly   Assembly

獲取指定類型的程序集

TypeAttributes   Attributes

獲取制定類型的特性

Type   BaseType

獲取指定類型的直接基類型

String  FullName

獲取指定類型的全名

bool   IsAbstract

如果指定類型是抽象類型,返回true

bool   IsClass

如果指定類型是類,返回true

string   Namespace

獲取指定類型的命名空間

 

Type類的方法

方法

描述

ConstructorInfo[]  GetConstructors()

獲取指定類型的構造函數列表

EventInfo[]   GetEvents();

獲取指定類型的時間列

FieldInfo[]   GetFields();

獲取指定類型的字段列

Type[]   GetGenericArguments();

獲取與已構造的泛型類型綁定的類型參數列表,如果指定類型的泛型類型定義,則獲得類型形參。對于正早構造的類型,該列表就可能同時包含類型實參和類型形

MethodInfo[]   GetMethods();

獲取指定類型的方法列表

PropertyInfo[]   GetProperties();

獲取指定類型的屬性列表e

MemberInfo[]   GetMembers();

獲取指定類型的成員列表

反射還有很多類,這里不一一介紹,詳細可以查閱MSDN:

https://msdn.microsoft.com/zh-cn/library/system.reflection.aspx

4.反射實例

下面通過一個實例來學習一下反射最基本的使用方法。

建立一個解決方案,包含兩個項目,項目ClassLibrary生成一個DLL(包含兩個類),另一個項目是ReflectionTestGet,用于反射調用類ClassLibrary

第一個項目的兩個類如下:

MartialArtsMaster.cs

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace ClassLibrary{    /// <summary>    /// 類:武林高手    /// MartialArtsMaster    /// </summary>    class MartialArtsMaster    {        /// <summary>        /// 級別        /// </summary>        public int _level = 9;        /// <summary>        /// 編號        /// </summary>        public int Id { get; set; }        /// <summary>        /// 姓名        /// </summary>        public string Name { get; set; }        /// <summary>        /// 年齡        /// </summary>        public int Age { get; set; }        /// <summary>        /// 門派        /// </summary>        public string Menpai { get; set; }        /// <summary>        /// 武學        /// </summary>        public string Kungfu { get; set; }        /// <summary>        /// 級別        /// </summary>        public int Level        {            get            {                return _level;            }            set            {                _level = value;            }        }        /// <summary>        /// 攻擊        /// </summary>        /// <param name="kungfu"></param>        /// <returns></returns>        public string Attack(string kungfu)        {            return "使用用了功夫:" + kungfu;        }        public string Kill(string kungfu, string name)        {            return "使用用了功夫:" + kungfu + "擊殺了" + name;        }    }}
View Code

Person.cs

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace ClassLibrary{    /// <summary>    /// 類:人    /// </summary>    class Person    {        public string gender { get; set; }        public string race { get; set; }        public string Country { get; set; }        public string Eat(string strCountry)        {            switch (strCountry)            {                case "美國":                    return "愛吃西餐";                case "韓國":                    return "愛吃泡菜";                default:                    return "不知道";            }        }    }}
View Code

第二個項目調用如下:

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Reflection;namespace ReflectionTestGet{    class Program    {        static void Main(string[] args)        {            Assembly asm = Assembly.LoadFrom("ClassLibrary.dll");  //加載指定的程序集            Type[] alltype = asm.GetTypes();  //獲取程序集中的所有類型列表            foreach (Type calssName in alltype)            {                Console.WriteLine("加載程序的集類名:"+ calssName.Name);  //打印出程序集所有類                foreach (var field in calssName.GetFields())                    Console.WriteLine(calssName.Name+"字段有:" + field.Name);  //打印出程序集所有字段,注意只能獲取公有字段                foreach (var pro in calssName.GetProperties())                    Console.WriteLine(calssName.Name + "屬性有:" + pro.Name);  //打印出程序集所有屬性                foreach (var met in calssName.GetMethods())                    Console.WriteLine(calssName.Name + "方法有:" + met.Name);  //打印出程序集所有方法            }            Console.ReadKey();        }    }}
View Code

運行結果如下:

5.本節要點:

本節主要介紹和反射的用途及反射的基本操作類及屬性方法,下節繼續深入介紹如何將反射技術應用于實際項目之中。

==============================================================================================  

 返回目錄

 <如果對你有幫助,記得點一下推薦哦,如有

有不明白或錯誤之處,請多交流>  

<對本系列文章閱讀有困難的朋友,請先看《.net 面向對象編程基礎》>

<轉載聲明:技術需要共享精神,歡迎轉載本博客中的文章,但請注明版權及URL>

.NET 技術交流群:467189533    .NET 程序設計

==============================================================================================   


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人网页在线免费观看| 国产精品狼人色视频一区| 亚洲国产精品va在线观看黑人| 亚洲中国色老太| 韩国欧美亚洲国产| 欧美午夜激情小视频| 青青久久aⅴ北条麻妃| 91在线高清免费观看| 亚洲一区二区精品| 777777777亚洲妇女| 日韩中文在线不卡| 欧美精品免费看| 欧美自拍视频在线| 日韩精品在线观看一区| 欧美性理论片在线观看片免费| 最近2019中文字幕在线高清| 国产精品igao视频| 久久中文字幕在线视频| 亚洲va久久久噜噜噜| 欧美一区第一页| 久久精品国产久精国产一老狼| 欧美日韩国产在线看| 国产精品美女久久久免费| 久久精品色欧美aⅴ一区二区| 992tv成人免费影院| 日韩中文字幕在线播放| 韩国精品美女www爽爽爽视频| 日韩最新中文字幕电影免费看| 欧美在线观看日本一区| 国内精品久久久久久久| 亚洲综合第一页| 国产91精品最新在线播放| 午夜精品久久久久久久久久久久久| www.欧美精品一二三区| 日韩www在线| 久久久久国产一区二区三区| 九色91av视频| 91av视频在线播放| 欧美日韩在线免费| 日韩在线中文字幕| 欧美日韩裸体免费视频| 欧美丰满老妇厨房牲生活| 高清亚洲成在人网站天堂| 国模精品视频一区二区| 日韩欧美福利视频| www.亚洲一区| 国产成人精品国内自产拍免费看| 91高清视频免费观看| 欧美激情视频给我| 欧美日韩第一视频| 欧美日韩久久久久| 国产一区二区三区三区在线观看| 欧美在线视频免费| 日本三级韩国三级久久| 欧美自拍视频在线| 欧美网站在线观看| 色无极影院亚洲| 7777精品视频| 亚洲欧美国产一本综合首页| 91久久国产精品91久久性色| 欧美性感美女h网站在线观看免费| 奇米四色中文综合久久| 欧美丰满少妇xxxxx做受| 国产日韩在线亚洲字幕中文| 91精品久久久久久久久久入口| 日韩一区二区三区国产| 欧美福利视频在线观看| 在线观看不卡av| 奇门遁甲1982国语版免费观看高清| 狠狠综合久久av一区二区小说| 久久久久国色av免费观看性色| 亚洲国产精品久久久久秋霞蜜臀| 国产区亚洲区欧美区| 久久黄色av网站| 午夜精品免费视频| 日本精品性网站在线观看| 国产一区二区三区在线播放免费观看| 久久久91精品国产| 亚洲人成电影网站色xx| 欧美激情a∨在线视频播放| 欧美性xxxxhd| 国产亚洲精品一区二555| 97精品国产97久久久久久春色| 中文字幕亚洲激情| 欧美国产精品人人做人人爱| 亚洲精品一区二区在线| 欧美日韩国产综合新一区| 欧美电影免费观看网站| 欧美国产欧美亚洲国产日韩mv天天看完整| 国产精品高精视频免费| 最新国产精品亚洲| 欧美视频第一页| 欧美日韩国产成人在线| 中文字幕在线观看亚洲| 人九九综合九九宗合| 91国产精品电影| 在线激情影院一区| 高清欧美电影在线| 8x拔播拔播x8国产精品| 一区二区三区日韩在线| 亚洲国产97在线精品一区| 国产精品日韩欧美大师| 国产一区二区三区丝袜| 最近中文字幕2019免费| 亚洲最大成人网色| 91黑丝在线观看| 国产精品大陆在线观看| 久久久亚洲国产天美传媒修理工| 欧美亚洲视频在线看网址| 亚洲激情久久久| 欧美专区福利在线| 中文字幕久久久av一区| 欧美日韩视频在线| 成人午夜激情免费视频| 日韩欧美精品网址| 啪一啪鲁一鲁2019在线视频| 日韩欧美亚洲范冰冰与中字| 亚洲精品aⅴ中文字幕乱码| 88xx成人精品| 亚洲在线视频观看| 国产成人涩涩涩视频在线观看| 日本一欧美一欧美一亚洲视频| 中文字幕综合在线| 日韩小视频在线| 中文字幕欧美精品日韩中文字幕| 国产精品香蕉在线观看| 国产欧美日韩丝袜精品一区| 久久精品国产亚洲7777| www.亚洲人.com| 亚洲精品久久在线| 精品国产乱码久久久久久虫虫漫画| 精品中文字幕在线2019| 国产精品精品一区二区三区午夜版| 日韩精品日韩在线观看| 欧美黄色小视频| 国产精品在线看| 亚洲精品中文字幕av| 欧美激情性做爰免费视频| 国产成人激情视频| 亚洲精品久久7777777| 精品国产欧美一区二区五十路| 日韩精品中文字幕在线播放| 国产欧美 在线欧美| 国产中文字幕91| 成人www视频在线观看| 亚洲色图av在线| 琪琪第一精品导航| 亚洲视频国产视频| 欧美成人在线影院| 在线观看日韩欧美| 国产精品成人av性教育| 久久精品国产99国产精品澳门| 色偷偷88888欧美精品久久久| 国内精品久久久久影院 日本资源| 91av中文字幕| 欧美巨乳在线观看| 欧美日韩亚洲国产一区| 九九久久久久99精品| 米奇精品一区二区三区在线观看| 成人午夜两性视频| 在线免费观看羞羞视频一区二区| 日韩中文字幕在线视频播放| 怡红院精品视频| 国产一区二区精品丝袜|