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