反射學(xué)習(xí)整理_第1頁
反射學(xué)習(xí)整理_第2頁
反射學(xué)習(xí)整理_第3頁
反射學(xué)習(xí)整理_第4頁
反射學(xué)習(xí)整理_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、反射學(xué)習(xí)整理   一、MSDN上面找的學(xué)習(xí)資料反射提供了封裝程序集、模塊和類型的對象(Type 類型)??梢允褂梅瓷鋭討B(tài)創(chuàng)建類型的實例,將類型綁定到現(xiàn)有對象,或從現(xiàn)有對象獲取類型并調(diào)用其方法或訪問其字段和屬性。如果代碼中使用了屬性,可以利用反射對它們進(jìn)行訪問。反射通常具有以下用途:·   使用 Assembly 定義和加載程序集,加載在程序集清單中列出的模塊,以及從此程序集中查找類型并創(chuàng)建該類型的實例。·   使用 Module 了解如下的類似信息:包含模塊的程序集以及模塊中的類等。您還可以獲取在模塊上定義的所有全局方法或其

2、他特定的非全局方法。·   使用 ConstructorInfo 了解以下信息:構(gòu)造函數(shù)的名稱、參數(shù)、訪問修飾符(如 public 或 private)和實現(xiàn)詳細(xì)信息(如 abstract 或 virtual)等。使用 Type 的 GetConstructors 或 GetConstructor 方法來調(diào)用特定的構(gòu)造函數(shù)。·   使用 MethodInfo 了解以下信息:方法的名稱、返回類型、參數(shù)、訪問修飾符(如 public 或 private)和實現(xiàn)詳細(xì)信息(如 abstract 或 virtual)等。使用 Type 的 Ge

3、tMethods 或 GetMethod 方法來調(diào)用特定的方法。·   使用 FieldInfo 了解以下信息:字段的名稱、訪問修飾符(如 public 或 private)和實現(xiàn)詳細(xì)信息(如 static)等;并獲取或設(shè)置字段值。·   使用 EventInfo 來了解如下的類似信息:事件的名稱、事件處理程序數(shù)據(jù)類型、自定義屬性、聲明類型和反射類型等;并添加或移除事件處理程序。·   使用 PropertyInfo 來了解如下的類似信息:屬性的名稱、數(shù)據(jù)類型、聲明類型、反射類型和只讀或可寫狀態(tài)等;并獲取

4、或設(shè)置屬性值。·   使用 ParameterInfo 來了解如下的類似信息:參數(shù)的名稱、數(shù)據(jù)類型、參數(shù)是輸入?yún)?shù)還是輸出參數(shù),以及參數(shù)在方法簽名中的位置等。·   當(dāng)您在一個應(yīng)用程序域的僅反射上下文中工作時,請使用 CustomAttributeData 來了解有關(guān)自定義屬性的信息。使用 CustomAttributeData,您不必創(chuàng)建屬性的實例就可以檢查它們。二、反射的重要應(yīng)用與相關(guān)練習(xí)反射在下列情況下很有用:·   需要訪問程序元數(shù)據(jù)的屬性。C# 具有一個反射系統(tǒng),可用來檢索用自定義屬性定義的信息

5、。主要方法是 GetCustomAttributes,它返回對象數(shù)組,這些對象在運行時等效于源代碼屬性。下面是我參照MSDN寫的一個例子:定義一個自定義屬性,將其應(yīng)用于若干實體并通過反射進(jìn)行檢索。 1using System; 2using System.Collections.Generic; 3using System.Text; 4 5namespace Attribut 6 7    /允許指定多個屬性實例,類YaoJian中進(jìn)行了練習(xí)&

6、#160;8    AttributeUsage(AttributeTargets.Class,AllowMultiple = true) 9    public class Students:Attribute10    11        string name;12     

7、0;  public int age;13        14        public Students(string Name)15        16            

8、;name = Name;17            age = 18;18        1920        public string GetName()21        

9、;22            return name;23        24    25    /將自定義屬性應(yīng)用于類26    Students("李江")27    class LiJiang2

10、8    29        /30    3132    /不定義Students屬性33    class ZhaoYong34    35        /36    37 

11、   /應(yīng)用多個屬性實例38    Students("姚鍵"),Students("李云",age = 20)39    class YaoJian40    41        /42    43    class&

12、#160;Program44    45        static void Main(string args)46        47            StudentsInfo(typeof(LiJiang);48  &

13、#160;         StudentsInfo(typeof(ZhaoYong);49            StudentsInfo(typeof(YaoJian);50        5152        privat

14、e static void StudentsInfo(Type t)53        54            Console.WriteLine("學(xué)生信息是:0",t);55            /獲取對象中的

15、自定義屬性56            Attribute att = Attribute.GetCustomAttributes(t);57            foreach (Attribute a in att)58     

16、60;      59                if (a is Students)60                61     

17、               Students S = (Students)a;62                    Console.WriteLine("學(xué)生的姓名是:0,年齡是:1",S.G

18、etName(),S.age.ToString();63                64            65        66    6768運行結(jié)果是:  ·

19、60;  檢查和實例化程序集中的類型。·   在運行時構(gòu)建新類型。使用 中的類。·   執(zhí)行后期綁定,訪問在運行時創(chuàng)建的類型的方法。三、實踐,用反射調(diào)用COM用反射調(diào)用COM非常的方便,不需要先對COM進(jìn)行注冊添加引用,用Assembly類中的LoadFrom方法直接可以講.dll文件加載到程序中,然后對其實例化使用。實例:1、先做一個簡單的調(diào)用系統(tǒng)outlook的COM。先在VS2005中建一個windows控件庫工程,取名為Send,然后把控件的界面刪掉,在Send工程中添加一個windows窗體也取名為Send,在窗體

20、的load事件里面寫代碼調(diào)用outlook。完整的代碼如下: 1using System; 2using System.Collections.Generic; 3using System.ComponentModel; 4using System.Data; 5using System.Drawing; 6using System.Text; 7using System.Windows.Forms; 8 9/使用進(jìn)程引用命名空間10u

21、sing System.Diagnostics;11namespace Send1213    public partial class Send : Form14    15        public Send()16        17   &

22、#160;        InitializeComponent();18        19        /*/ <summary>20        / 在Form_Load中調(diào)用Windows帶的outlook21  &

23、#160;     / </summary>22        / <param name="sender"></param>23        / <param name="e"></param>24   &

24、#160;    private void Send_Load(object sender, EventArgs e)25        26            Process P = new Process();27    

25、         = "C:Program FilesOutlook Expressmsimn.exe"28            P.Start();29            this.Close();30 

26、;       31    3233代碼寫完以后,生成一下,這時在工程的bin文件夾下面就生成了一個Send.dll的文件。2、用反射來調(diào)用上面的COM在Send工程的解決方案上面點擊右鍵添加/新建項目/windows應(yīng)用程序,取名Fanshe在Form1上面添加一個button,并設(shè)置其相關(guān)屬性,界面如圖:把上面生成的Send.dll放到Fanshe的bin目錄下面,在button的click事件中添加代碼調(diào)用COM,完整代碼如下: 1using System;&

27、#160;2using System.Collections.Generic; 3using System.ComponentModel; 4using System.Data; 5using System.Drawing; 6using System.Text; 7using System.Windows.Forms; 8 9/使用反射引用的命名空間10using System.Reflection;1112namespace Fanshe13

28、14    public partial class frm : Form15    16        public frm()17        18            I

29、nitializeComponent();19        2021        private void btn_Click(object sender, EventArgs e)22        23        &#

30、160;   /*/*加載COM,這樣寫COM的默認(rèn)路徑在bin文件夾下,如果不在可以通過絕對路徑或者相對路徑指到COM所在的位置24             *比如:Assembly.LoadFrom("D:/App/Send.dll")或Assembly.LoadFrom("./Send.dll")25             */26   

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論