麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

.NET 反射詳解(轉(zhuǎn))

2019-11-17 01:59:38
字體:
供稿:網(wǎng)友

.NET 反射詳解(轉(zhuǎn))

概述反射

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

運行時類型標(biāo)識

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

is運算符:

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

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對象可以轉(zhuǎn)換為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運算符:

  在運行期間執(zhí)行類型轉(zhuǎn)換,并且能夠使得類型轉(zhuǎn)換失敗不拋異常,而返回一個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變量轉(zhuǎn)換為B類型是無效的。            }            else            {                b = null;            }            if (b ==null)            {                //這個打印                Console.WriteLine("The cast in b=(B)a is not allowed");             }            //上面使用as運算符,能夠把兩部合二為一。            b = a as B;   //as類型先檢查強制類型轉(zhuǎn)換的有效性,如果有效,則執(zhí)行強類型轉(zhuǎn)換過程。這些都在這一句完成。            if (b == null)            {                //這個打印                Console.WriteLine("The cast in b=(B)a is not allowed");            }            Console.ReadKey();        }    }    class A { }    class B : A { }

typeof運算符:

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

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類包裝了類型,因此是整個反射子系統(tǒng)的核心,這個類中包含了很多屬性和方法,使用這些屬性和方法可以在運行時得到類型的信息。
  • Type類派生于System.Reflection.MemberInfo抽象類

MemberInfo類中的只讀屬性

屬性

描述

TypeDeclaringType

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

MemberTypesMemberType

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

IntMetadataToken

獲取與特定元數(shù)據(jù)相關(guān)的值

ModuleModule

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

StringName

成員的名稱

TypeReflectedType

反射的對象類型

請注意

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

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

Type類定義的方法

方法

功能

ConstructorInfo[] GetConstructors()

獲取指定類型的構(gòu)造函數(shù)列表

EventInfo[] GetEvents();

獲取指定類型的時間列

FieldInfo[] GetFields();

獲取指定類型的字段列

Type[] GetGenericArguments();

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

MemberInfo[] GetMembers();

獲取指定類型的成員列表

MethodInfo[] GetMethods();

獲取指定類型的方法列表

PropertyInfo[] GetProperties();

獲取指定類型的屬性列表

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

Type類定義的屬性

屬性

功能

Assembly Assembly

獲取指定類型的程序集

TypeAttributes Attributes

獲取制定類型的特性

Type BaseType

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

String FullName

獲取指定類型的全名

bool IsAbstract

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

bool IsClass

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

string Namespace

獲取指定類型的命名空間

使用反射

上面的列術(shù)都是為了,這里的使用。

通過使用Type類定義的方法和屬性,我們能夠在運行時獲得類型的各種具體信息。這是一個非常強大的功能。我們一旦得到類型信息,就可以調(diào)用其構(gòu)造函數(shù),方法,和屬性。可見,反射是允許使用編譯時不可用的代碼的。

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

這里我列出四種關(guān)鍵的反射技術(shù):

  1. 獲取方法的信息
  2. 調(diào)用方法
  3. 構(gòu)造對象
  4. 從程序集中加載類型

獲取方法的相關(guān)信息

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

MethodInfo類派生于Method

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 538任你躁在线精品视频网站 | 久久久久久麻豆 | 黑人一级片视频 | 亚洲人成在线播放 | 免费一级电影 | 精品在线观看一区 | 欧美 亚洲 视频 | 日韩在线欧美在线 | 视频一区二区三区免费观看 | 成人三级黄色片 | 久久新地址 | 一区二区三视频 | 欧美成人免费电影 | 亚洲福利在线免费观看 | 男女无遮挡羞羞视频 | 黄污网址 | 国产伦久视频免费观看视频 | 娇喘视频在线观看 | 看国产精品 | 久久色播| 97人操 | 欧美jizzhd极品欧美 | 毛片天天看 | 曰韩黄色片| bt 自拍 另类 综合 欧美 | 免费在线看a | 成人在线视频黄色 | 久久逼逼 | 色淫网站免费视频 | 毛片a级毛片免费播放100 | 销魂美女一区二区 | 色中色在线播放 | 深夜影院一级毛片 | 性猛aa久久久 | 高清国产福利 | 精品一区二区免费视频视频 | 在线观看国产免费视频 | 在线亚洲欧美 | 午夜在线视频一区二区三区 | 亚洲一级成人 | 久久蜜桃精品一区二区三区综合网 |