C#反射(二)C#反射(二)

來源:互聯網
上載者:User
C#反射(二) 

    如果沒有看《C#反射(一)》、建議先看《C#反射(一)》再看這一篇。上一篇文章發表,有人評論我所寫的東西比較基礎。其實我也知道我也只不過是在寫最基礎的文法而已,之所以寫它是因為自己學編程學了一兩年之後才接觸到反射,相信會有很多人跟我有過同樣的經曆。概其原因,書店裡幾乎90%的書籍都不談反射。還有,曾經在百度、goole搜尋過反射,但也很難找到自己喜歡的答案。希望我所寫的東西能為那些初學編程的新手有所協助。

我不想在這裡過多的描述反射的概念。我還是用我自己覺得最簡單、最直接的語言來描述反射——“反射就是一種機制,通過這種機制,我們能知道一些位知程式集的詳細資料!”;通過上一篇我們已經學會如何得到一個未知程式集的相關資訊,接下來我要講的是如何知道未知程式模組的資訊:

模組資訊是通過Module類訪問的。下面通過一個類子,講解下Module類的使用,如果你是一個用心的程式員,應該瞭解下Module的詳細資料。

還是繼續使用C#反射(一)的類子。下面我們寫一個新的檔案ModuleDemo.cs。內容如下:

//編譯命令 csc /r:Sport.dll ModuleDemo.cs

using System;

using System.Reflection;

 

public class ModuleDemo

{

   public static void Main(string[] args)

   {

    //=======================

    // Am Module object is obtained representing the

    // SomeSports.dll library file

    //=======================

 

    Assembly assembly = Assembly.Load("SomeSports");

    Module module = assembly.GetModule("SomeSports.dll");

 

    //======================

    //Search the module for the type named "Football"

 

    Type[] types = module.FindTypes(Module.FilterTypeName,"Football");

 

    if(types.Length != 0)

    {

       ConstructorInfo ci = types[0].GetConstructor(new Type[0]);

       Sport sport = (Sport)ci.Invoke(new Object[0]);

 

       Console.WriteLine(sport.GetName() + " has "+sport.GetDuration());

    }

    else

    {

       Console.WriteLine("type not found");

    }

   }

}

我們用csc /r:Sport.dll ModuleDemo.cs編譯,然後用MouduleDemo運行程式就能看到如下輸出:Football has four 15 minute quarters。

    關於C#反射的基礎知識,還有一個知識點就是訪問未知對象的類型資訊。在下一篇我將介紹它,並介紹我自己曾經寫過的一個應用,可以實現具有相同屬性或網域名稱的不同類型對象之間的資料相互複製(在Java中可用於J2EE中POJO到Form Bean之間的資料複製)。

    如果沒有看《C#反射(一)》、建議先看《C#反射(一)》再看這一篇。上一篇文章發表,有人評論我所寫的東西比較基礎。其實我也知道我也只不過是在寫最基礎的文法而已,之所以寫它是因為自己學編程學了一兩年之後才接觸到反射,相信會有很多人跟我有過同樣的經曆。概其原因,書店裡幾乎90%的書籍都不談反射。還有,曾經在百度、goole搜尋過反射,但也很難找到自己喜歡的答案。希望我所寫的東西能為那些初學編程的新手有所協助。

我不想在這裡過多的描述反射的概念。我還是用我自己覺得最簡單、最直接的語言來描述反射——“反射就是一種機制,通過這種機制,我們能知道一些位知程式集的詳細資料!”;通過上一篇我們已經學會如何得到一個未知程式集的相關資訊,接下來我要講的是如何知道未知程式模組的資訊:

模組資訊是通過Module類訪問的。下面通過一個類子,講解下Module類的使用,如果你是一個用心的程式員,應該瞭解下Module的詳細資料。

還是繼續使用C#反射(一)的類子。下面我們寫一個新的檔案ModuleDemo.cs。內容如下:

//編譯命令 csc /r:Sport.dll ModuleDemo.cs

using System;

using System.Reflection;

 

public class ModuleDemo

{

   public static void Main(string[] args)

   {

    //=======================

    // Am Module object is obtained representing the

    // SomeSports.dll library file

    //=======================

 

    Assembly assembly = Assembly.Load("SomeSports");

    Module module = assembly.GetModule("SomeSports.dll");

 

    //======================

    //Search the module for the type named "Football"

 

    Type[] types = module.FindTypes(Module.FilterTypeName,"Football");

 

    if(types.Length != 0)

    {

       ConstructorInfo ci = types[0].GetConstructor(new Type[0]);

       Sport sport = (Sport)ci.Invoke(new Object[0]);

 

       Console.WriteLine(sport.GetName() + " has "+sport.GetDuration());

    }

    else

    {

       Console.WriteLine("type not found");

    }

   }

}

我們用csc /r:Sport.dll ModuleDemo.cs編譯,然後用MouduleDemo運行程式就能看到如下輸出:Football has four 15 minute quarters。

    關於C#反射的基礎知識,還有一個知識點就是訪問未知對象的類型資訊。在下一篇我將介紹它,並介紹我自己曾經寫過的一個應用,可以實現具有相同屬性或網域名稱的不同類型對象之間的資料相互複製(在Java中可用於J2EE中POJO到Form Bean之間的資料複製)。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.