c#之初见反射
一.什么是反射
? ? ? ? ? 1.1 提供封裝程序集、模塊和類型的對象,說明它是一個(gè)對象
?
? ? ? ? ? 1.2 ? 反射,一種計(jì)算機(jī)處理方式。是程序可以訪問、檢測和修改它本身狀態(tài)或行為的一種能力。 ? ? ? ? ? ? 1.3??程序集包含模塊,而模塊包含類型,類型又包含成員。反射則提供了封裝程序集、模塊和類型的對象。 ? ? ? ? ? ? 1.4 ?可以使用反射動(dòng)態(tài)地創(chuàng)建類型的實(shí)例,將類型綁定到現(xiàn)有對象,或從現(xiàn)有對象中獲取類型。然后, ? ? ? ? ? ? ? ? ? 可以調(diào)用類型的方法或訪問其字段和屬性。 ? ? ? ? ? ? ? ? ?———百度百科? 二.c#中的反射介紹? ? ? ? ??.2.1使用的命名空間——System.Reflection
? ? ? ? ? ?2.1反射使用的核心類 Type,?Assembly ,Activator
? ? ? ? ? ?2.1.1Type:Type對象提供的屬性和方法可以獲取對象的一切信息,如:方法、字段、屬性、事件...等等
? ? ? ? ? ?2.2.2Assembly:可以通過Assembly的信息來獲取程序的類,實(shí)例等編程需要用到的信息。
? ? ? ? ? ?2.2.3Activator:包含特定的方法,用以在本地或從遠(yuǎn)程創(chuàng)建對象類型,或獲取對現(xiàn)有遠(yuǎn)程對象的引用
? ? ? ? ? ?2.3其他的使用類,Module ,ConstructorInfo ,?MethodInfo ,?FieldInfo,PropertyInfo。。。。
? ? ? ? ? ?2.3.1Module:包含模塊的程序集以及模塊中的類等。可以獲取在模塊上定義的所有全局方法或其他特定的非全局方法。
? ? ? ? ? ?2.3.2ConstructorInfo:解如下的類似信息:構(gòu)造函數(shù)的名稱、參數(shù)、訪問修飾符(如 public 或 private)和實(shí)現(xiàn)詳細(xì)信息
? ? ? ? ?(如 abstract ?或 virtual)等。
? ? ? ? ? 2.3.3MethodInfo :了解如下的類似信息:方法的名稱、返回類型、參數(shù)、訪問修飾符(如 public 或 private)和實(shí)現(xiàn)詳細(xì)信
? ? ? ? ?息(如abstract 或 virtual)等。使用 Type 的 GetMethods 或 GetMethod 方法來調(diào)用特定的方法。
? ? ? ? ? 2.3.4?FieldInfo:來了解如下的類似信息:字段的名稱、訪問修飾符(如 public 或 private)和實(shí)現(xiàn)詳細(xì)信息(如 static)等;
? ? ? ? ?并獲取或設(shè)置字段值。
? ? ? ? ? 2.3.5PropertyInfo:來了解如下的類似信息:屬性的名稱、數(shù)據(jù)類型、聲明類型、反射類型和只讀或可寫狀態(tài)等;并獲取或設(shè)置屬性值。
三.簡單的使用反射
? ? ? ? ?3.1.利用Type獲取類型和類的信息
? ? ? ? ??
string str = "";//使用類名來獲取類型 Type typeClass = typeof(string);//使用對象來獲取類型Type typeObj = str.GetType();//打印str的類型Console.WriteLine("typeClass' type is {0}\n,typeObj ' type is {1}",typeClass.Name, typeObj.Name);Console.WriteLine("*********************************************");//BindingFlags.Instance|BindingFlags.Public//| BindingFlags.NonPublic 獲取類型的公開和非公開的屬性foreach (PropertyInfo PI in typeObj.GetProperties(BindingFlags.Instance |BindingFlags.Public | BindingFlags.NonPublic)){//打印類型的屬性名字和屬性的類型Console.WriteLine("{0} TYPE IS {1}, ",PI.Name, PI.PropertyType.Name); }Console.WriteLine("*********************************************");//BindingFlags.Instance|BindingFlags.Public//| BindingFlags.NonPublic 獲取類型的公開和非公開的方法foreach (MethodInfo MI in typeObj.GetMethods(BindingFlags.Instance |BindingFlags.Public | BindingFlags.NonPublic)){//打印類型的方法名字Console.WriteLine("{0}'s FUCN IS {1} ",typeObj.Name, MI.Name);}Console.ReadKey();?
?
3.2上面我們用Type獲取類型的信息 下面我們用獲取的類型來創(chuàng)建的對象
使用type創(chuàng)建對象
class SayHello{public SayHello(){Console.WriteLine("THIS IS SAYHELLO");}public void Say(){Console.WriteLine("I'M SAYING SAYHELLO");}}//動(dòng)態(tài)創(chuàng)建類型Type type = typeof(SayHello);Activator.CreateInstance(type);程序會(huì)打印一個(gè)THIS IS SAYHELLO 說明我們創(chuàng)建了一個(gè)對象
?
3.3如何使用這個(gè)對象
? 1. 我們可以使用接口來使用這個(gè)對象這種方法在這里就不說了
? 2.我們可以使用MethodInfo這個(gè)類來調(diào)用方法
Type type = typeof(SayHello);//在type中找到Say方法MethodInfo say = type.GetMethod("Say");//激活A(yù)ctivator.CreateInstance(type)的對象的Say方法say.Invoke(Activator.CreateInstance(type),null);?
以上只是一些非常基礎(chǔ)的知識,希望可以幫助大家對反射有一個(gè)基本的認(rèn)識。
?
轉(zhuǎn)載于:https://www.cnblogs.com/KeyThink/p/7373681.html
總結(jié)
- 上一篇: poj1753 Flip Game(枚举
- 下一篇: 泛型类