根據類名字串例項化類,並呼叫類的方法或函式
2011-03-15 13:32
//獲取型別資訊
//如果呼叫其他的dll
asmb = system.reflection.assembly.loadfrom("dll名");
// type t = asmb.gettype("類名");
//如果是不呼叫其他dll
system.reflection.assembly bll = system.reflection.assembly.load("www.www.bll");
system.type t = bll.gettype("www.www.bll."+viewstate["bll"].tostring());
try ;
//取得方法返回的值
object returnvalue = method.invoke(dobj, flag, type.defaultbinder, parameters, null);
}
catch (system.exception ex)
說明:assembly assembly = assembly.loadfile("程式集路徑,不能是相對路徑"); // 引導程式集(exe 或 dll)
object obj = assembly.createinstance("類的完全限定名(即包括命名空間)"); // 建立類的例項
若要反射當前專案中的類可以為:
assembly assembly = assembly.getexecutingassembly(); // 獲取當前程式集
object obj = assembly.createinstance("類的完全限定名(即包括命名空間)"); // 建立類的例項,返回為 object 型別,需要強制型別轉換
也可以為:
type type = type.gettype("類的完全限定名");
object obj = type.assembly.createinstance(type);
補充:1)反射建立某個類的例項時,必須保證使用類的完全限定名(命名空間 + 類名)。type.gettype 方法返回 null 則意味搜尋元資料中的相關資訊失敗(反射失敗),請確保反射時使用類的完全限定名。
2)反射功能十分強大,沒有什麼不能實現的。
「跨程式集」(如下),請使用我給的第一種方法建立類的例項,並反射該例項的字段、屬性、方法、事件... 然後動態呼叫之。
「反射」其實就是利用程式集的元資料資訊。
「跨程式集」反射可以有很多方法,編寫程式時請先導入 system.reflection 命名空間,假設你要反射乙個 dll 中的類,並且沒有引用它(即未知的型別):
assembly assembly = assembly.loadfile("程式集路徑,不能是相對路徑"); // 引導程式集(exe 或 dll)
object obj = assembly.createinstance("類的完全限定名(即包括命名空間)"); // 建立類的例項
根據類名字串建立類名並且呼叫類裡的方法
根據類名字串例項化類,並呼叫類的方法或函式 2011 03 15 13 32 獲取型別資訊 如果呼叫其他的dll asmb system.reflection.assembly.loadfrom dll名 type t asmb.gettype 類名 如果是不呼叫其他dll system.refle...
根據字串建立類例項(支援全名和部分名)
根據字串建立類例項 object obj 如果是類的全名 加了命名空間 string classfullname 反射2222.class1 obj system.activator.createinstance type.gettype classfullname 如果不是類的全名 加了命名空間 ...
C 中根據類的名稱字串建立類的例項
這種用法很像是工廠類,但是我們不需要自己實現字串到型別的對應關係,也不需要建立的類有繼承關係,如下 第一步 得到類的全名 命名空間 類名 string adaptorname this.gettype fullname case ha this.pi.name 第二部 根據全名得到類的型別 type...