亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

<學習>.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通過它可以了解構造函數的屬性及調用構造函數??梢杂蒚ype對象的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

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲国产精品成人一区二区| 日韩国产高清污视频在线观看| 久久久最新网址| 欧美精品一区二区三区国产精品| 日韩中文字幕网| 中文字幕亚洲综合久久| 国产精品久在线观看| 91夜夜揉人人捏人人添红杏| 久久精品青青大伊人av| 欧美伊久线香蕉线新在线| 亚洲欧美日韩爽爽影院| 91网站免费观看| 久久久久久久色| 日韩av免费在线播放| 欧美日韩国产一区在线| 成人精品久久久| 欧美黑人性猛交| 日韩欧美在线第一页| 日韩电影网在线| 国产精品扒开腿做爽爽爽的视频| 亚洲国产古装精品网站| 精品偷拍各种wc美女嘘嘘| 欧美噜噜久久久xxx| 日韩av电影国产| 国产欧美日韩视频| 在线精品国产成人综合| 久久免费视频在线观看| 性日韩欧美在线视频| 日韩美女免费视频| 8090成年在线看片午夜| 一区二区av在线| 日韩在线观看免费全| 成人av色在线观看| 久久精品视频导航| 黑人精品xxx一区一二区| 日韩亚洲一区二区| 国产香蕉精品视频一区二区三区| 欧美高清自拍一区| 综合网中文字幕| 福利二区91精品bt7086| 午夜精品一区二区三区在线视频| 欧美精品情趣视频| 欧美视频中文在线看| 伊人久久五月天| 国产免费一区二区三区在线观看| 一区二区三区亚洲| 欧美精品在线第一页| 亚洲九九九在线观看| 91国产一区在线| 国产一区二区激情| xvideos亚洲人网站| 久久人人看视频| 超碰精品一区二区三区乱码| 日韩精品在线影院| 欧美色videos| 亚州精品天堂中文字幕| 国产a级全部精品| 91免费国产网站| 国产丝袜视频一区| 欧美精品激情blacked18| www.日本久久久久com.| 菠萝蜜影院一区二区免费| 日韩成人中文字幕在线观看| 亚洲新中文字幕| 久久成人国产精品| 欧美一区二区影院| 57pao成人永久免费视频| 久久av在线播放| 欧美激情视频网| 91九色视频在线| 欧美精品日韩三级| 日韩精品免费在线| 久久天天躁狠狠躁夜夜躁2014| 欧美一区二区视频97| 亚洲另类图片色| 日本精品久久久| 8090成年在线看片午夜| 日韩欧美有码在线| 亚洲精品suv精品一区二区| 亚洲91精品在线观看| 欧美黑人又粗大| 国产精品91在线观看| 亚洲精品视频在线播放| 欧美激情一级欧美精品| 亚洲一区二区日本| 57pao国产成人免费| 精品国产乱码久久久久久虫虫漫画| 亚洲欧洲在线播放| 超碰91人人草人人干| 26uuu亚洲国产精品| 亚洲精品成人av| 777精品视频| 亚洲国产另类久久精品| 久久久中精品2020中文| 尤物九九久久国产精品的分类| 亚洲国产精品久久91精品| 亚洲免费成人av电影| 高清日韩电视剧大全免费播放在线观看| 亚洲福利影片在线| 国产拍精品一二三| 欧美精品一区三区| 欧美中文在线字幕| 欧美一区二区三区图| 欧美xxxx做受欧美.88| 国产综合视频在线观看| 日本中文字幕成人| 欧美老女人在线视频| 国产亚洲欧美视频| 一区二区三区国产视频| 亚洲成色777777在线观看影院| 久久久久亚洲精品国产| 亚洲一区二区三区乱码aⅴ| 成人免费视频在线观看超级碰| 欧美美女操人视频| 欧美国产日韩二区| 中文字幕日韩在线观看| 国产欧美精品一区二区| 欧美在线视频观看| 日韩成人激情视频| 精品国产乱码久久久久久天美| 欧美精品成人在线| 久久久在线免费观看| 国产精品高潮粉嫩av| 亚洲va久久久噜噜噜| 国产69精品久久久久99| 亚洲国产婷婷香蕉久久久久久| 欧美在线视频网| 97超级碰在线看视频免费在线看| 国产精品999| 日韩在线视频免费观看高清中文| 97碰在线观看| 国产a∨精品一区二区三区不卡| 欧美日韩免费区域视频在线观看| 精品久久国产精品| 亚洲free性xxxx护士hd| 久久天天躁狠狠躁夜夜爽蜜月| 日韩理论片久久| 美女视频黄免费的亚洲男人天堂| 久久艹在线视频| 欧美性高跟鞋xxxxhd| 亚洲人成在线观看| 欧美有码在线观看视频| 日本精品视频在线观看| 国产精品午夜一区二区欲梦| 亚洲精品狠狠操| 色七七影院综合| 亚洲一区二区久久久久久久| 日韩欧中文字幕| 国产亚洲精品va在线观看| 精品亚洲va在线va天堂资源站| 成人看片人aa| 久久久久久av| 91人人爽人人爽人人精88v| 久久亚洲国产成人| 欧美午夜片在线免费观看| 国产精品盗摄久久久| 久久综合国产精品台湾中文娱乐网| 欧美激情视频在线| 精品国产福利在线| 欧美激情视频在线免费观看 欧美视频免费一| 国产女同一区二区| 欧美xxxx做受欧美| 一二美女精品欧洲| 欧美韩国理论所午夜片917电影|