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

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

<學習>.NET的反射基礎

2019-11-14 16:38:56
字體:
來源:轉載
供稿:網友

關鍵詞

Assembly使用Assembly定義和加載程序集,加載在程序集清單中列出模塊,以及從此程序集中查找類型并創建該類型的實例。
Module通過它可以獲取包含模塊的程序集以及模塊中的類等,還可以獲取在模塊上定義的所有全局方法或其他特定的非全局方法。 
MemberInfo這是一個基類,它定義了EventInfo、FieldInfo、MethodInfo、PRopertyInfo的多個公用行為。
Type是System命名空間下的一個類,一般用于裝載反射得到的類對象,通過Type可以得到一個類的內部信息,也可以通過它反射創建一個對象。
EventInfo通過它可以獲取事件的相關信息。如事件的名稱、事件處理程序數據類型、聲明類型等,還可以添加或移除事件處理程序。
FieldInfo可以通過它獲取字段的相關信息。如字段的名稱、訪問修飾符等,還可以獲取或設置字段值。 
MethodInfo通過它可以獲取方法的相關信息。例如方法的名稱、返回類型、參數、訪問修飾符等。使用Type的GetMethods或GetMethod方法來調用特定的方法。
PropertyInfo通過它可以獲取屬性的相關信息。例如屬性的名稱、數據類型、聲明類型和只讀或可寫狀態等,還可以獲取或設置屬性值。
ConstructorInfo通過它可以了解構造函數的屬性及調用構造函數。可以由Type對象的GetConstructors或GetConstructor方法返回的。
ParameterInfo通過它可以了解參數相關信息。例如參數的名稱、數據類型、是輸入參數還是輸出參數,以及參數在方法簽名中的位置等。

什么是反射?

Reflection,中文翻譯為反射,是.Net中獲取運行時類型信息的方式。
.Net的應用程序由幾個部分:程序集(Assembly)、模塊(Module)、類型 (class)組成,而反射提供一種編程的方式,讓程序員可以在程序運行期獲得這幾個組成部分的相關信息。

如何使用反射獲取程序集?

通過Assembly類對象的Load方法、LoadFrom方法和LoadFile方法可以獲取程序集的相關信息。

三者之間的區別:
LoadFrom和Load差不多,只是LoadFrom是多了先獲取其中的程序集版本,語言文化,公鑰標記等信息,把他們傳遞給 Load方法這一步。
LoadFrom不能用于加載標識相同但路徑不同的程序集。
LoadFile 方法用來來加載和檢查具有相同標識但位于不同路徑中的程序集.但不會加載程序的依賴項。
1、Assembly.LoadFile只載入相應的dll文件,比如Assembly.LoadFile("abc.dll"),則載入abc.dll,假如abc.dll中引用了def.dll的話,def.dll并不會被載入。
Assembly.LoadFrom則不一樣,它會載入dll文件及其引用的其他dll,比如上面的例子,def.dll也會被載入。
2、用Assembly.LoadFrom載入一個Assembly時,會先檢查前面是否已經載入過相同名字的Assembly,比如abc.dll有兩個版本(版本1在目錄1下,版本2放在目錄2下),程序一開始時載入了版本1,當使用Assembly.LoadFrom("2//abc.dll")載入版本2時,不能載入,而是返回版本1。
Assembly.LoadFile的話則不會做這樣的檢查,比如上面的例子換成Assembly.LoadFile的話,則能正確載入版本2。

如何使用反射獲取模塊?

1、用Object.GetType().Module來獲取。
2、用Assembly類對象的GetModules方法來獲取。

如何使用反射獲取Type對象?

1、用typeof運算符獲取。
2、用靜態方法Type.GetType來獲取。
3、用Assembly類對象的GetType或者GetTypes方法來獲取。

如何根據類型來動態創建對象?

1、用System.Reflection空間下的Assembly類對象的CreateInstance方法來創建對象。
2、用System.Activator類提供的靜態方法CreateInstance來創建對象。

如何獲取方法以及動態調用特定的方法?

通過Type類對象的GetMethod或者GetMethods方法獲取到類里面的方法,然后用MethodInfo對象的Invoke方法去執行。

如何獲取字段以及動態設置獲取它?

通過Type類對象的GetField方法來獲取字段,用FieldInfo對象存儲獲取到的字段,可以通過FieldInfo對象的GetValue和SetValue方法讀取和設置字段。

如何獲取屬性以及動態設置獲取它?

通過Type類對象的GetPropertie或者GetProperties方法來獲取屬性,用PropertyInfo對象存儲獲取到的屬性,然后通過PropertyInfo對象的GetValue和SetValue方法讀取和設置屬性值。

動手嘗試

1、創建個類庫工程,在這工程里面定義一個類。(我這里工程名為:Study__Reflection,類名為:StudyReflection)

 1 namespace Study__Reflection 2 {    3     public class StudyReflection 4     { 5         /// <summary> 6         /// 學習 7         /// </summary> 8         /// <param name="name">姓名</param> 9         /// <returns>字符串</returns>10         public string Study(string name)11         {12             return name + "正在學習反射";13         }14         /// <summary>15         /// 無參構造函數16         /// </summary>17         public StudyReflection() { }18 19         /// <summary>20         /// 有參構造函數21         /// </summary>22         /// <param name="a"></param>23         /// <param name="b"></param>24         public StudyReflection(int a, int b)25         {26             SetValue(a, b);27         }28 29         #region 私有成員變量30         private int x;31         private int y;32         public string Status;33         #endregion34 35         #region 屬性36         public int X37         {38             get { return x; }39             set { x = value; }40         }41 42         public int Y43         {44             get { return y; }45             set { y = value; }46         }47 48         #endregion49         /// <summary>50         /// 計算x和y的和51         /// </summary>52         /// <returns>x+y</returns>53         public int sum()54         {55             return x + y;56         }57 58         /// <summary>59         /// 取2個數之間的商的整數60         /// </summary>61         /// <param name="z"></param>62         /// <param name="t"></param>63         /// <returns></returns>64         public int div(int z, int t)65         {66             return z/t;67         }68 69         /// <summary>70         /// 計算x和y的積71         /// </summary>72         /// <returns>x*y</returns>73         private int product()74         {75             return x * y;76         }77         /// <summary>78         /// 給x和y賦值79         /// </summary>80         /// <param name="a">整形a</param>81         /// <param name="b">整形b</param>82         public void SetValue(int a,int b)83         {84             x = a;85             y = b;86         }87     }88 }
View Code

把這工程指定好路徑編譯好。生成的dll文件就是準備用于學習反射相關知識的。

下面是反射的基本用法: 

 1 //獲取程序集 2 Assembly asem = Assembly.LoadFrom("../lib/Study_ Reflection.dll"); 3 //Assembly asem2 = Assembly.Load("Study_ Reflection, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"); 4 //Assembly asem3 = Assembly.LoadFile(@"D:/mythings/Study/lib/Study_ Reflection.dll"); //注意是全路徑 5  6 //用Object.GetType().Module來獲取。 7 Class1 cc = new Class1(); 8 Module m = cc.GetType().Module; 9 //用Assembly類對象的GetModules方法來獲取。10 if (asem == null)11 {12     asem = Assembly.LoadFrom("../lib/Study_ Reflection.dll");13 }14 Module[] ms = asem.GetModules();15 16 //通過Assembly.GetType獲取Type17 Type t = asem.GetType("Study__Reflection.StudyReflection");18 19 //通過Assembly.CreateInstance進行無參數實例化20 object awc = asem.CreateInstance("Study__Reflection.StudyReflection", true);21 //通過Activator.CreateInstance進行無參數實例化22 object aa = Activator.CreateInstance(asem.FullName, "Study__Reflection.StudyReflection").Unwrap();23 //通過Activator.CreateInstance方法傳入Type對象執行默認的無參數構造函數來創建實例24 object o = Activator.CreateInstance(t);25 //通過Assembly.CreateInstance進行有參數實例化26 object[] te = new object[2] { 100, 200 };27 object ayc = asem.CreateInstance("Study__Reflection.StudyReflection", true, BindingFlags.Default, null, te, null, null);28 29 //屬性30 PropertyInfo[] ps = t.GetProperties(); //通過Type.GetProperties獲取屬性31 PropertyInfo p = t.GetProperty("X"); //通過Type.GetPropertie來獲取指定名稱的屬性32 p.SetValue(o, 99);  //給X屬性賦值33 p.GetValue(o);  //讀取X屬性34 //獲取字段35 FieldInfo[] fs = t.GetFields(); //通過Type.GetFields獲取字段36 FieldInfo f = t.GetField("Status"); //通過Type.GetField來獲取指定名稱的字段37 f.SetValue(o, "奮發圖強"); //給Status字段賦值38 f.GetValue(o);  //讀取Status字段39 //獲取方法40 MethodInfo[] methods = t.GetMethods();//通過Type.GetMethods獲取方法41 MethodInfo method_div = t.GetMethod("div"); //通過Type.GetMethod來獲取指定名稱的方法42 method_div.Invoke(o, new object[] { 2222, 333 });//調用有2個參數的div方法
View Code

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 凤阳县| 榕江县| 玛曲县| 长葛市| 胶州市| 娄烦县| 攀枝花市| 淮阳县| 孟连| 鹤山市| 阳山县| 育儿| 新巴尔虎右旗| 麻城市| 平罗县| 犍为县| 醴陵市| 广西| 东莞市| 佳木斯市| 普宁市| 蒙山县| 丁青县| 龙江县| 龙山县| 沙雅县| 米林县| 大渡口区| 康平县| 沽源县| 即墨市| 崇礼县| 汶川县| 江安县| 宜春市| 磴口县| 汝阳县| 太仆寺旗| 漳浦县| 丽江市| 孝义市|