控制項,在實現快速開發中起著非常重要的作用,它可以將某一特定功能封裝起來,供可戶程式員調用,更重要的是它還可以實現外掛程式式開發,使軟體的靈活性、可擴充 性大大增強。在網路上,也有很多動態載入控制項、動態調用類成員等的資料。
動態載入,最基本用到的就是反射機制。在System.Reflection的namespace下有一系列的關於擷取Assembly資訊、類(型)資訊 的類、介面、結構等。可能上面的話對急切想實現動態載入控制項的朋友來說可能一點用也沒有,那麼就看下面的代碼吧,也許可以使你馬上實現你想要的:
1.載入控制項
Assembly assembly = Assembly.LoadFrom(@"C:Controls.dll");
2.獲得類(型)
Type type = assembly.GetType("Controls.UserControl",false,true);
3.設定篩選標誌
BindingFlags bflags = BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance;
4.調用建構函式並獲得對象
Object obj = type.InvokeMember("UserControl", bflags | BindingFlags.CreateInstance, null, null, null);
5.將對象轉換類型
System.Windows.Forms.Control control = (Control)obj;
6.將控制項添加到表單
this.Controls.Add(control);
====================================================================================
下面對上面程式段用到的一些變數、方法做一點說明
1.BindingFlags 枚舉類型
BindingFlags.Instance : 對象執行個體
BindingFlags.Static : 靜態成員
BindingFlags.Public : 指可在搜尋中包含公用成員
BindingFlags.NonPublic : 指可在搜尋中包含非公用成員(即私人成員和受保護的成員)
BindingFlags.FlattenHierarchy : 指可包含階層上的靜態成員
BindingFlags.IgnoreCase : 表示忽略 name 的大小寫
BindingFlags.DeclaredOnly : 僅搜尋 Type 上聲明的成員,而不搜尋被簡單繼承的成員
BindingFlags.CreateInstance : 表示調用建構函式。忽略 name。對其他調用標誌無效
2.Type.InvokeMember
public object InvokeMember(
string name,
BindingFlags invokeAttr,
Binder binder,
object target,
object[] args
);
參數
name
String,它包含要調用的建構函式、方法、屬性或欄位成員的名稱。 或 Null 字元串 (""),表示調用預設成員。
invokeAttr
一 個位屏蔽,由一個或多個指定搜尋執行方式的 BindingFlags 組成。 訪問可以是 BindingFlags 之一,如Public、 NonPublic、Private、 InvokeMethod 和 GetField 等。不需要指定尋找類型。如果省略尋找類型, 則將應用 BindingFlags.Public | BindingFlags.Instance。
binder
一個 Binder 對象,該對象定義一組屬性並啟用綁定,而綁定可能涉及選擇重載方法、 強制參數類型和通過反射調用成 員。 - 或 - 若為空白引用(Visual Basic 中為 Nothing),則使用 DefaultBinder。
target 要在其上調用指定成員的 Object。
args 包含傳遞給要調用的成員的參數的數組。
傳回值 表示被調用成員的傳回值的 Object。