這篇文章主要介紹了詳解C# 利用反射根據類別名稱創建類別的實例物件,「反射」其實就是利用組件的元資料訊息,感興趣的小夥伴們可以參考一下。
「反射」其實就是利用組件的元資料資訊。 反射可以有很多方法,寫程式時請先匯入 System.Reflection 命名空間。
1、假設你要反射一個DLL 中的類,並且沒有引用它(即未知的類型):
Assembly assembly = Assembly.LoadFile("程序集路径,不能是相对路径"); // 加载程序集(EXE 或 DLL) dynamic obj = assembly.CreateInstance("类的完全限定名(即包括命名空间)"); // 创建类的实例
2、若要反射目前專案中的類別(即目前專案已經引用它了)可以是:
Assembly assembly = Assembly.GetExecutingAssembly(); // 获取当前程序集 dynamic obj = assembly.CreateInstance("类的完全限定名(即包括命名空间)"); // 创建类的实例,返回为 object 类型,需要强制类型转换
3、也可以是:
Type type = Type.GetType("类的完全限定名"); dynamic obj = type.Assembly.CreateInstance(type);
4、不同組件的話,則要裝載調用,程式碼如下:
System.Reflection.Assembly.Load("組件名稱(不含檔案後綴名)").CreateInstance("命名空間.類別名稱" , false);
如:
程式碼如下:
dynamic o = System.Reflection.Assembly.Load("MyDll").CreateInstance("MyNameSpace.A", false);
注意:由於要用到dynamic ,需要把target 改為4.0 ,如果編譯時出現「找不到編譯動態表達式所需的一個或多個型別。是否缺少引用?」的錯誤,是因為缺少一個引用,在專案裡引用Miscorsoft.CSharp類別函式庫,新增後就能編譯成功。
========================================= ==============
補充:
1)反射建立某個類別的實例時,必須確保使用類別的完全限定名(命名空間+ 類別名稱)。 Type.GetType 方法傳回 null 則意義搜尋元資料中的相關資訊失敗(反射失敗),請確保反射時使用類別的完全限定名。
2)反射功能十分強大,沒有什麼不能實現的。若實作“跨組件”,請使用第一種方法建立類別的實例,並反射該實例的欄位、屬性、方法、事件... 然後動態呼叫之。
/// <summary> /// 反射帮助类 /// </summary> public static class ReflectionHelper { /// <summary> /// 创建对象实例 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="fullName">命名空间.类型名</param> /// <param name="assemblyName">程序集</param> /// <returns></returns> public static T CreateInstance<T>(string fullName, string assemblyName) { string path = fullName + "," + assemblyName;//命名空间.类型名,程序集 Type o = Type.GetType(path);//加载类型 object obj = Activator.CreateInstance(o, true);//根据类型创建实例 return (T)obj;//类型转换并返回 } /// <summary> /// 创建对象实例 /// </summary> /// <typeparam name="T">要创建对象的类型</typeparam> /// <param name="assemblyName">类型所在程序集名称</param> /// <param name="nameSpace">类型所在命名空间</param> /// <param name="className">类型名</param> /// <returns></returns> public static T CreateInstance<T>(string assemblyName, string nameSpace, string className) { try { string fullName = nameSpace + "." + className;//命名空间.类型名 //此为第一种写法 object ect = Assembly.Load(assemblyName).CreateInstance(fullName);//加载程序集,创建程序集里面的 命名空间.类型名 实例 return (T)ect;//类型转换并返回 //下面是第二种写法 //string path = fullName + "," + assemblyName;//命名空间.类型名,程序集 //Type o = Type.GetType(path);//加载类型 //object obj = Activator.CreateInstance(o, true);//根据类型创建实例 //return (T)obj;//类型转换并返回 } catch { //发生异常,返回类型的默认值 return default(T); } } }
以上是C#利用反射根據類別名稱創建類別的實例物件的詳細介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!