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

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

.NET 反射詳解(轉)

2019-11-17 01:59:38
字體:
來源:轉載
供稿:網友

.NET 反射詳解(轉)

概述反射

  • 通過反射可以提供類型信息,從而使得我們開發人員在運行時能夠利用這些信息構造和使用對象。
  • 反射機制允許程序在執行過程中動態地添加各種功能。

運行時類型標識

  • 運行時類型標識(RTTI),可以在程序執行期間判定對象類型。例如使用它能夠確切地知道基類引用指向了什么類型對象。
  • 運行時類型標識,能預先測試某個強制類型轉換操作,能否成功,從而避免無效的強制類型轉換異常。
  • 在c#中有三個支持RTTI的關鍵字:is 、 as 、typeof。 下面依次介紹他們

is運算符:

  通過is運算符,能夠判斷對象類型是否為特定類型,如果兩種類型是相同類型,或者兩者之間存在引用,裝箱拆箱轉換,則表明兩種類型是兼容的。

class PRogram    {        static void Main(string[] args)        {            A a = new A();            B b = new B();            if (a is A)              {                Console.WriteLine("a is an A");   //這個打印,因為a 是 A 類型的對象            }            if (b is A)            {                //這個打印,因為b是B類型的對象,而B類型派生于A類型,由于b對象可以轉換為A類型,因此b對象與A類型是兼容的,但是反過來就不成立,例如下面不打印                Console.WriteLine("b is an A because it is derived from");             }            if (a is B)            {                //這個不打印                Console.WriteLine("This won't display , because a not derived from B");            }            if (a is object)            {                //這個打印                Console.WriteLine("a is an object");            }            Console.ReadKey();        }    }    class A { }    class B : A { }

as運算符:

  在運行期間執行類型轉換,并且能夠使得類型轉換失敗不拋異常,而返回一個null值,其實as也可以看作一個is運算符的簡化備選方式(看例子)。

class Program    {        static void Main(string[] args)        {            A a = new A();            B b = new B();            if (a is B)            {                b = (B)a;   //由于a變量不是B類型,因此這里將a變量轉換為B類型是無效的。            }            else            {                b = null;            }            if (b ==null)            {                //這個打印                Console.WriteLine("The cast in b=(B)a is not allowed");             }            //上面使用as運算符,能夠把兩部合二為一。            b = a as B;   //as類型先檢查強制類型轉換的有效性,如果有效,則執行強類型轉換過程。這些都在這一句完成。            if (b == null)            {                //這個打印                Console.WriteLine("The cast in b=(B)a is not allowed");            }            Console.ReadKey();        }    }    class A { }    class B : A { }

typeof運算符:

  as ,is 能夠測試兩種類型的兼容性。但大多數情況下,還需要獲得某個類型的具體信息。這就用到了typeof,它可以返回與具體類型相關的System.Type對象,通過System.Type對象可以去頂此類型的特征。一旦獲得給定類型的Type對象,就可以通過使用該對象定義的各種屬性,字段,方法來獲取類型的具體信息。Type類包含了很多成員,在接下來的反射中再詳細討論。下面簡單的演示Type對象,調用它的三個屬性。

static void Main(string[] args)        {            Type t=typeof(StringBuilder);            Console.WriteLine(t.FullName);  //FullName屬性返回類型的全稱            if (t.IsClass)            {                Console.WriteLine("is a class"); //打印            }            if (t.IsSealed)  //是否為密封類            {                Console.WriteLine("is Sealed");  //打印            }            Console.ReadKey();        }

反射的核心類:System.Type類

  • 許多支持反射的類都位于System.Reflection命名空間中,他們是.net Reflection API的一部分,所以在使用的反射的程序中一般都要使用 System.Reflection的命名空間。
  • System. Type類包裝了類型,因此是整個反射子系統的核心,這個類中包含了很多屬性和方法,使用這些屬性和方法可以在運行時得到類型的信息。
  • Type類派生于System.Reflection.MemberInfo抽象類

MemberInfo類中的只讀屬性

屬性

描述

TypeDeclaringType

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

MemberTypesMemberType

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

IntMetadataToken

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

ModuleModule

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

StringName

成員的名稱

TypeReflectedType

反射的對象類型

請注意

  • MemberType屬性的返回類型為MemberTypes,這是一個枚舉,它定義了用于表示不同成員的類型值。這些值包括:MemberTypes.Constructor, MemberTypes.Method, MemberTypes.Field, MemberTypes.Event, MemberTypes.Property。因此可以通過檢查MemberType屬性來確定成員的類型,例如,在MemberType屬性的值為MemberTypes.Method時,該成員為方法
  • MemberInfo類還包含兩個與特性相關的抽象方法:
    1. GetCustomAttributes() :獲得與主調對象關聯的自定義特性列表。
    2. IsDefined(): 確定是否為主調對象定義了相應的特性。
    3. GetCustomAttributesData():返回有關自定義特性的信息(特性稍后便會提到)

當然除了MemberInfo類定義的方法和屬性外,Type類自己也添加了許多屬性和方法:如下表(只列出一些常用的,太多了,自己可以轉定義Type類看下)

Type類定義的方法

方法

功能

ConstructorInfo[] GetConstructors()

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

EventInfo[] GetEvents();

獲取指定類型的時間列

FieldInfo[] GetFields();

獲取指定類型的字段列

Type[] GetGenericArguments();

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

MemberInfo[] GetMembers();

獲取指定類型的成員列表

MethodInfo[] GetMethods();

獲取指定類型的方法列表

PropertyInfo[] GetProperties();

獲取指定類型的屬性列表

下面列出Type類定義的常用的只讀屬性

Type類定義的屬性

屬性

功能

Assembly Assembly

獲取指定類型的程序集

TypeAttributes Attributes

獲取制定類型的特性

Type BaseType

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

String FullName

獲取指定類型的全名

bool IsAbstract

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

bool IsClass

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

string Namespace

獲取指定類型的命名空間

使用反射

上面的列術都是為了,這里的使用。

通過使用Type類定義的方法和屬性,我們能夠在運行時獲得類型的各種具體信息。這是一個非常強大的功能。我們一旦得到類型信息,就可以調用其構造函數,方法,和屬性??梢姡瓷涫窃试S使用編譯時不可用的代碼的。

由于Reflection API非常多,這里不可能完整的介紹他們(這里如果完整的介紹,據說要一本書,厚書)。但是,Reflection API是按照一定邏輯設計的。因此,只要知道部分接口的使用方法,就可以舉一反三的使用剩余的接口。

這里我列出四種關鍵的反射技術:

  1. 獲取方法的信息
  2. 調用方法
  3. 構造對象
  4. 從程序集中加載類型

獲取方法的相關信息

一旦有了Type對象就可以使用GetMethodInfo()方法獲取此類型支持的方法列表。該方法返回一個MethodInfo 對象數組,MethodInfo對象描述了主調類型所支持的方法,他位于System.Reflection命名空間中

MethodInfo類派生于Method

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91精品综合久久久久久五月天| 中文字幕日韩欧美精品在线观看| 欧美日韩成人精品| 欧美日本中文字幕| 久久在线视频在线| 一本一本久久a久久精品牛牛影视| 中文字幕亚洲一区二区三区五十路| 国产一区二区香蕉| 在线精品91av| 亚洲精品乱码久久久久久按摩观| 成人免费观看a| 欧美专区在线播放| 97在线视频免费播放| 欧美亚洲在线观看| 91精品久久久久久久久久另类| 亚洲人线精品午夜| 欧美成人三级视频网站| 亚洲欧美中文字幕在线一区| 91系列在线播放| 亚洲精品美女免费| 亚洲欧美日韩精品久久奇米色影视| 日韩一区二区三区在线播放| 国产成人久久精品| 日韩电影中文 亚洲精品乱码| 欧美一级黄色网| 久久夜精品va视频免费观看| 在线观看国产欧美| 中文日韩在线视频| 欧美日本高清一区| 91视频九色网站| 国产日韩精品在线观看| 久久不射电影网| 91九色综合久久| 欧美午夜久久久| 久久久天堂国产精品女人| 久久亚洲精品一区二区| 日韩中文在线中文网三级| 日韩在线观看视频免费| 欧美激情精品在线| 亚洲自拍偷拍视频| 最近中文字幕2019免费| 国产精品久久久久久久app| 久久免费精品视频| 国产一区二区三区在线观看视频| 久久伊人91精品综合网站| 午夜精品视频网站| 亚洲人精品午夜在线观看| 日韩精品视频免费在线观看| 日本中文字幕不卡免费| 亚洲精品小视频| 亚洲免费伊人电影在线观看av| 一个人看的www欧美| 91po在线观看91精品国产性色| 2019中文在线观看| 欧美日本啪啪无遮挡网站| 九色成人免费视频| 日韩精品高清在线观看| 国产亚洲人成a一在线v站| 热久久免费国产视频| 色天天综合狠狠色| 538国产精品一区二区在线| 国产精品美乳一区二区免费| 欧美孕妇孕交黑巨大网站| 色伦专区97中文字幕| 亚洲欧美日韩另类| 国产视频丨精品|在线观看| 久久久久在线观看| 欧美丝袜美女中出在线| 欧美日韩亚洲精品一区二区三区| 国产精品私拍pans大尺度在线| 国产精品欧美一区二区三区奶水| 国产精品99免视看9| 国产亚洲免费的视频看| 久久久免费观看视频| 中文字幕精品久久| 欧美日韩成人网| 色婷婷av一区二区三区久久| 欧美日韩国产二区| 精品国产鲁一鲁一区二区张丽| 国产精品999| 成人亚洲激情网| 亚洲人成电影网站色| 91精品国产综合久久香蕉922| 久久影视免费观看| 久久韩国免费视频| 在线观看欧美日韩国产| 欧美裸体男粗大视频在线观看| 久久久久久久久中文字幕| 国产精品电影一区| 精品自拍视频在线观看| 亚洲黄页网在线观看| 亚洲综合社区网| 成人两性免费视频| 日韩精品在线免费观看视频| 欧美贵妇videos办公室| 另类色图亚洲色图| 国产日韩中文在线| 久久久成人av| 亚洲精品美女久久久| 精品电影在线观看| 国产午夜精品理论片a级探花| 91中文字幕在线观看| 成人免费看吃奶视频网站| 久久久女人电视剧免费播放下载| 欧美日韩综合视频网址| 欧美—级高清免费播放| 久久久久久中文字幕| 日本不卡视频在线播放| 91人成网站www| 日韩欧美在线视频日韩欧美在线视频| 欧美高清自拍一区| 久久免费福利视频| 91久久嫩草影院一区二区| 亚洲xxxxx| 亚洲香蕉成人av网站在线观看| 精品久久久久久久久久久久久久| 日本久久久久久久久久久| 欧美成人免费在线视频| 色偷偷av一区二区三区乱| 69**夜色精品国产69乱| 91九色综合久久| 中文字幕av一区| 国产一区二区在线播放| 国产精品91在线| 日韩经典第一页| 日韩视频―中文字幕| 国产福利精品av综合导导航| 国产亚洲欧美视频| 91麻豆桃色免费看| 国语自产精品视频在线看抢先版图片| 欧美电影在线免费观看网站| 中文字幕一区二区三区电影| 欧美激情网站在线观看| 国产成+人+综合+亚洲欧美丁香花| 欧美成在线观看| 国产国语videosex另类| 色播久久人人爽人人爽人人片视av| 日韩激情视频在线| 91在线视频一区| 亚洲精品suv精品一区二区| 欧美精品免费在线观看| 久久久久久久国产精品视频| 久久精品夜夜夜夜夜久久| 亚洲色图在线观看| 色诱女教师一区二区三区| 一区二区三区无码高清视频| 国产婷婷色综合av蜜臀av| 日韩视频永久免费观看| 中文字幕最新精品| 欧美激情视频三区| 国产日产亚洲精品| 亚洲欧美日韩爽爽影院| 视频在线观看一区二区| 国产成人综合久久| 国产日本欧美一区二区三区| 国产精品xxx视频| 国产精品日日摸夜夜添夜夜av| 国产精品久久一| 亚洲国产精品女人久久久| 精品二区三区线观看| 成人网欧美在线视频| 久久精品国产亚洲7777| 欧美俄罗斯性视频| 九九热精品视频在线播放|