国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

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

.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類定義的方法和屬性,我們能夠在運行時獲得類型的各種具體信息。這是一個非常強大的功能。我們一旦得到類型信息,就可以調用其構造函數,方法,和屬性。可見,反射是允許使用編譯時不可用的代碼的。

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

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

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

獲取方法的相關信息

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

MethodInfo類派生于Method

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 城固县| 旬邑县| 独山县| 岳阳县| 体育| 金昌市| 纳雍县| 建湖县| 大荔县| 鄂州市| 定襄县| 福安市| 赣州市| 胶州市| 沂南县| 富阳市| 清流县| 七台河市| 伊金霍洛旗| 攀枝花市| 普格县| 河西区| 张掖市| 上高县| 和硕县| 青海省| 长兴县| 淮滨县| 礼泉县| 通海县| 江源县| 抚州市| 垣曲县| 高邮市| 江门市| 乐清市| 万载县| 河源市| 太白县| 穆棱市| 西林县|