如果沒有看《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之間的數據復制)。
