轉(zhuǎn)帖|其它|編輯:郝浩|2011-10-17 17:17:41.000|閱讀 513 次
概述:控件在實(shí)現(xiàn)快速開(kāi)發(fā)中起著非常重要的作用,它可以將某一特定功能封裝起來(lái),供可戶(hù)程序員調(diào)用,更重要的是它還可以實(shí)現(xiàn)插件式開(kāi)發(fā),使軟件的靈活性、可擴(kuò)充 性大大增強(qiáng)。在網(wǎng)絡(luò)上,也有很多動(dòng)態(tài)加載控件、動(dòng)態(tài)調(diào)用類(lèi)成員等的資料。下面,我就將動(dòng)態(tài)加載控件總結(jié)一下,以供大家參考。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門(mén)軟控件火熱銷(xiāo)售中 >>
控件在實(shí)現(xiàn)快速開(kāi)發(fā)中起著非常重要的作用,它可以將某一特定功能封裝起來(lái),供可戶(hù)程序員調(diào)用,更重要的是它還可以實(shí)現(xiàn)插件式開(kāi)發(fā),使軟件的靈活性、可擴(kuò)充 性大大增強(qiáng)。在網(wǎng)絡(luò)上,也有很多動(dòng)態(tài)加載控件、動(dòng)態(tài)調(diào)用類(lèi)成員等的資料。下面,我就將動(dòng)態(tài)加載控件總結(jié)一下,以供大家參考。
一、動(dòng)態(tài)加載控件
動(dòng)態(tài)加載,最基本用到的就是反射機(jī)制。在System.Reflection的namespace下有一系列的關(guān)于獲取Assembly信息、類(lèi)(型)信 息的類(lèi)、接口、結(jié)構(gòu)等。可能上面的話(huà)對(duì)急切想實(shí)現(xiàn)動(dòng)態(tài)加載控件的朋友來(lái)說(shuō)可能一點(diǎn)用也沒(méi)有,那么就看下面的代碼吧,也許可以使你馬上實(shí)現(xiàn)你想要的:
//加載控件
Assembly assembly = Assembly.LoadFrom (@ "C:\Controls.dll");
//獲得類(lèi)(型)
Type type = assembly.GetType( "Controls.UserControl",false,true);
//設(shè)置篩選標(biāo)志
BindingFlags bflags = BindingFlags.DeclaredOnly | BindingFlags.Public
| BindingFlags.NonPublic | BindingFlags.Instance;
//調(diào)用構(gòu)造函數(shù)并獲得對(duì)象
Object obj = type.InvokeMember( "UserControl", bflags |
BindingFlags.CreateInstance, null, null, null);
//將對(duì)象轉(zhuǎn)換類(lèi)型
System.Windows.Forms.Control c = (Control)obj;
//將控件添加到窗體
this.Controls.Add(c);
下面對(duì)上面程序段用到的一些變量、方法做一點(diǎn)說(shuō)明
1、BindingFlags,枚舉類(lèi)型
BindingFlags.Instance :對(duì)象實(shí)例
BindingFlags.Static :靜態(tài)成員
BindingFlags.Public:指可在搜索中包含公共成員
BindingFlags.NonPublic :指可在搜索中包含非公共成員(即私有成員和受保護(hù)的成員)
BindingFlags.FlattenHierarchy:指可包含層次結(jié)構(gòu)上的靜態(tài)成員
BindingFlags.IgnoreCase :表示忽略 name 的大小寫(xiě)
BindingFlags.DeclaredOnly:僅搜索 Type 上聲明的成員,而不搜索被簡(jiǎn)單繼承的成員
BindingFlags.CreateInstance:表示調(diào)用構(gòu)造函數(shù)。忽略 name。對(duì)其他調(diào)用標(biāo)志無(wú)效
2、Type.InvokeMember
public object InvokeMember(
string name,
BindingFlags invokeAttr,
Binder binder,
object target,
object[] args
);
參數(shù)
name
String,它包含要調(diào)用的構(gòu)造函數(shù)、方法、屬性或字段成員的名稱(chēng)。
- 或 -
空字符串 ( ""),表示調(diào)用默認(rèn)成員。
invokeAttr
一個(gè)位屏蔽,由一個(gè)或多個(gè)指定搜索執(zhí)行方式的 BindingFlags 組成。 訪(fǎng)問(wèn)可以是 BindingFlags 之一,如Public、 NonPublic、Private、 InvokeMethod 和 GetField 等。不需要指定查找類(lèi)型。如果省略查找類(lèi)型, 則將應(yīng)用 BindingFlags.Public | BindingFlags.Instance。
binder
一個(gè) Binder 對(duì)象,該對(duì)象定義一組屬性并啟用綁定,而綁定可能涉及選擇重載方法、 強(qiáng)制參數(shù)類(lèi)型和通過(guò)反射調(diào)用成 員。 - 或 - 若為空引用(Visual Basic 中為 Nothing),則使用 DefaultBinder。
target
要在其上調(diào)用指定成員的 Object。
args
包含傳遞給要調(diào)用的成員的參數(shù)的數(shù)組。
返回值
表示被調(diào)用成員的返回值的 Object。
二、插件編程
通過(guò)上面代碼段,我們基本實(shí)現(xiàn)動(dòng)態(tài)加載控件。由此我想到了現(xiàn)在網(wǎng)上提到很多的插件式的開(kāi)發(fā)方法。通過(guò)動(dòng)態(tài)加載控件,我們不是能很方便的為軟件擴(kuò)充功能 嗎?我不知道Eclipse這種插件是怎么實(shí)現(xiàn)的,但至少這種動(dòng)態(tài)加載控件的方法實(shí)現(xiàn)插件編程的一個(gè)變通的方法。不是嗎?我把一個(gè)功能模塊做成一個(gè)控件, 然后在程序啟動(dòng)是掃描目錄,即可獲得所有的控件,當(dāng)點(diǎn)擊菜單是,將控件加載到窗體就行了。我在母體程序里,我們所要做的只不過(guò)要一個(gè)容器窗口類(lèi)來(lái)加載控 件。當(dāng)然,事先要有些約定,比如說(shuō),控件有哪些可供調(diào)用的方法等等。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:網(wǎng)絡(luò)轉(zhuǎn)載