在編寫代碼的時候,我們可能還不知道或不能确定一些對象的資訊,于是把決定權交給代碼本身,将來在需要的時候由代碼本身去擷取和判斷這些資訊,并做出相應的反應。在這種情況的驅使下,反射技術産生了。
反射是.Net中的重要機制,通過反射,可以在運作時獲得.Net中每一個類型(包括類、結構、委托、接口和枚舉等)成員,包括方法、屬性、事件,以及構造函數等。還可以獲得每個成員的名稱、限定符和參數等。有了反射,即可對每一個類型了如指掌。如果獲得了構造函數的資訊,即可直接建立對象,即使這個對象的類型在編譯時還不知道。反射是一種晚綁定,它可以被開發者用來設計出更具靈活性的代碼,而代價則是花費更多的系統資源開銷使應用程式可以在運作時擷取一些未知資訊。
今天我們就以通過DLL檔案選擇,來展示如何通過反射來建立窗體。程式運作界面如下:

通過浏覽按鈕,我們選擇包含窗體的DLL檔案。然後通過反射機制,我們把該DLL中的窗體列到左側的清單中。點選相應的窗體,在右側窗格中建立該窗體執行個體。
執行個體的檔案結構如下:
ReflectionTest為我們的主展示窗體,WindowsForms為我們的Dll類包。
WindowsForms類中,就是我們為了展示反射建立的幾個不同的窗體,這個比較簡單就不介紹了。下面我們介紹一下ReflectionTest程式集中的FormMain。
該類中主要有兩個方法最為重要,第一個是ShowDll(),這個是用來展示選擇的DLL中的所有窗體的,代碼如下:
/// <summary>
/// 通過反射,展示DLL檔案中的窗體清單
/// </summary>
private void ShowDll()
{
Assembly assembly = Assembly.LoadFile(selectedDll);
Type[] typeArr = assembly.GetTypes();
foreach (Type type in typeArr)
{
if (type.BaseType.Name == "Form")
{
listBox_Forms.Items.Add(type.FullName);
}
}
}
第二個是ShowForm(),用來建立選擇的窗體的執行個體,并将此執行個體展示到Panel中,代碼如下:
/// <summary>
/// 通過反射,建立選擇的窗體的執行個體,并展示到展示窗格panel中
/// </summary>
private void ShowForm()
{
panel_FormViewer.Controls.Clear();
Assembly assembly = Assembly.LoadFile(selectedDll);
Type[] typeArr = assembly.GetTypes();
Form form = (Form)System.Activator.CreateInstance(assembly.GetType(selectedForm));
form.TopLevel = false;
panel_FormViewer.Controls.Add(form);
form.Show();
}
到此,反射的簡單應用,你了解了嗎?!
文章中所使用的代碼,在附件中,請自行下載下傳。