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之間的資料複製)。