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

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

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

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

[.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永久在线播放| 自拍亚洲一区欧美另类| 欧美激情成人在线视频| 国产精品丝袜一区二区三区| 日韩电视剧免费观看网站| 九九综合九九综合| 伊人久久久久久久久久久| 亚洲jizzjizz日本少妇| 国产一区二区三区在线观看视频| 国外成人性视频| 久久久久久国产精品三级玉女聊斋| 精品国偷自产在线视频99| 91精品国产综合久久久久久久久| 亚洲日本欧美日韩高观看| 久青草国产97香蕉在线视频| 国内伊人久久久久久网站视频| 欧美日韩亚洲精品内裤| 欧美亚洲国产精品| 青青久久av北条麻妃海外网| 成人有码在线视频| 中文字幕自拍vr一区二区三区| 欧美午夜激情小视频| 精品日本高清在线播放| 欧美中文字幕在线| 欧美日韩国产精品专区| 成人黄色午夜影院| 欧美俄罗斯性视频| 国产精品久久久久久久一区探花| 国产自产女人91一区在线观看| 国产精品极品美女粉嫩高清在线| 亚洲影院污污.| 主播福利视频一区| 国产精品成人一区二区三区吃奶| 伊人久久久久久久久久久久久| 欧美激情视频在线观看| 国产精品极品美女粉嫩高清在线| 久久成人这里只有精品| 成人在线视频福利| 亚洲成色999久久网站| 日韩极品精品视频免费观看| 日韩日本欧美亚洲| 成人伊人精品色xxxx视频| 97精品视频在线观看| 日韩欧美成人精品| 欧美激情国产精品| 国产a∨精品一区二区三区不卡| 97精品国产aⅴ7777| 色噜噜狠狠色综合网图区| 亚洲男子天堂网| 亚洲人成电影在线| 久久99国产精品久久久久久久久| 92版电视剧仙鹤神针在线观看| 亚洲欧美日本伦理| 国产亚洲日本欧美韩国| 日韩精品亚洲精品| 国产精品久久久久久亚洲调教| 亚洲精品福利免费在线观看| 亚洲影院在线看| 久久久女人电视剧免费播放下载| 国产成+人+综合+亚洲欧美丁香花| 国产这里只有精品| 国产成人精品午夜| 欧美日韩福利电影| 久久夜色精品国产欧美乱| 亚洲福利视频二区| 在线电影av不卡网址| 91成人免费观看网站| 国产91精品久久久| 国产91av在线| 亚洲欧美在线一区二区| 久久亚洲综合国产精品99麻豆精品福利| 精品露脸国产偷人在视频| 人九九综合九九宗合| 亚洲精品中文字| 国产丝袜视频一区| 91精品国产电影| 日本精品视频在线| 国产精品亚洲综合天堂夜夜| 九九热在线精品视频| 亚洲qvod图片区电影| 国产精品久久一区| 国产精品h在线观看| 欧美日韩国产中文精品字幕自在自线| 亚洲男人天堂手机在线| 久久偷看各类女兵18女厕嘘嘘| 久久久999国产精品| 性色av一区二区三区红粉影视| 亚洲视频在线播放| xvideos国产精品| 2019亚洲日韩新视频| 91精品视频在线播放| 亚洲女人天堂视频| www.久久久久久.com| 国产男人精品视频| 国产亚洲视频中文字幕视频| 69av在线视频| 欧美精品成人91久久久久久久| 少妇高潮 亚洲精品| 欧美激情aaaa| 亚洲电影免费观看高清完整版在线观看| 亚洲一区二区自拍| 亚洲影院高清在线| 久久久久国产精品www| 欧美成人久久久| 亚洲人精品午夜在线观看| 亚洲欧美成人精品| 国产精品日韩在线播放| 欧美色图在线视频| www国产精品com| 精品视频偷偷看在线观看| 欧美大片在线看免费观看| 国产一区二区三区直播精品电影| 中国china体内裑精亚洲片| 精品久久久久久久中文字幕| 视频一区视频二区国产精品| 成人午夜高潮视频| 91av在线免费观看视频| 亚洲午夜未删减在线观看| 欧美色另类天堂2015| 亚洲精品一区中文字幕乱码| 日韩精品在线看| 国产精品自在线| 亚洲高清不卡av| 亚洲国产精品一区二区久| 亚洲网站在线观看| 国产精品国产三级国产专播精品人| 川上优av一区二区线观看| 日本精品免费观看| 亚洲一区www| 91丨九色丨国产在线| 久久综合久久八八| 久久网福利资源网站| 久久99久久亚洲国产| 亚洲女人初尝黑人巨大| 成人夜晚看av| 伊人久久久久久久久久久| 97超级碰碰碰| 欧美成人中文字幕| 奇门遁甲1982国语版免费观看高清| 久久视频在线看| 欧美日韩国产二区| 欧美疯狂做受xxxx高潮| 欧美成人免费一级人片100| 国产精品狠色婷| 久久福利网址导航| 狠狠干狠狠久久| 日韩一二三在线视频播| 日韩av电影院| 日韩免费av片在线观看| 性欧美xxxx| 欧美在线免费观看| 欧美刺激性大交免费视频| 性亚洲最疯狂xxxx高清| 日韩69视频在线观看| 97成人在线视频| 亚洲精品久久7777777| 国产精品网红直播| 欧美—级高清免费播放| 国产精品永久免费观看| 久久精品视频中文字幕| 538国产精品视频一区二区| 97在线视频精品|