根據類名字串執行個體化類,並調用類的方法或函數
2011-03-15 13:32
//擷取類型資訊
//如果調用其他的DLL
//System.Reflection.Assembly 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 dObj = Activator.CreateInstance(t);
//擷取方法的資訊
System.Reflection.MethodInfo method = t.GetMethod("Delete");
//調用方法的一些標誌位(根據你的方法的標誌設定)
System.Reflection.BindingFlags flag = System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Static;
//方法的參數
object[] parameters = new object[] { int.Parse(ViewState["ID"].ToString()) };
//取得方法返回的值
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("類的完全限定名(即包括命名空間)"); // 建立類的執行個體