標籤:
C#主要支援 5 種動態建立對象的方式: 1. Type.InvokeMember 2. ContructorInfo.Invoke 3. Activator.CreateInstance(Type) 4. Activator.CreateInstance(assemblyName, typeName) 5. Assembly.CreateInstance(typeName) 最快的是方式 3 ,與 Direct Create 的差異在一個數量級之內,約慢 7 倍的水平。其他方式,至少在 40 倍以上,最慢的是方式 4 ,要慢三個數量級。 盡量NEW ,少反射
Assembly.CreateInstance()建立執行個體與New的區別 區別一: new是調用的newobj方法來直接執行個體化對象在託管堆上分配記憶體的,編譯時間確定的,並且編譯時間進行了類型檢查。 CreateInstance方法是通過調用程式集的中繼資料,根據中繼資料描述來建立對象的,類型不安全的,但是它可以動態建立對象。優勢應該在於靈活吧。 區別二: Assembly.CreateInstance()是動態載入,即運行時建立類,編譯時間不驗證類是否存在。 new是靜態載入。編譯時間類已經被編譯。
Assembly.Load("程式集名稱").CreateInstance("命名空間.類") 見:http://www.tuicool.com/articles/bIjUzu
class Program { static void Main(string[] args) { ILoveMM mm = (ILoveMM)Assembly.Load("Reflection").CreateInstance("Reflection.LoveMM");//這塊直接強制類型轉換就行 mm.Output(); } } interface ILoveMM { void Output(); } class LoveMM : ILoveMM { public void Output() { Console.WriteLine("I love you MM"); } }
關於反射中Assembly.CreateInstance()與Activator.CreateInstance()方法的區別 msdn,查到了兩個方法的介紹: Assembly.CreateInstance 方法 (String) 使用區分大小寫搜尋,從此程式集中尋找指定的類型,然後使用系統啟用器建立它的執行個體。 Activator.CreateInstance 方法 (Type) 使用與指定參數匹配程度最高的建構函式來建立指定類型的執行個體。
//從程式集建立對象執行個體 string path = System.Configuration.ConfigurationSettings.AppSettings["DAL"];//資料層的程式集名稱 return (IDbObject)Assembly.Load(path).CreateInstance(path+".DbObject");
如果你的資料層不是單獨的程式集,可以採用如下方法載入
//從程式集建立對象執行個體string path = System.Configuration.ConfigurationSettings.AppSettings["DAL"];//資料層的程式集名稱return (IDbObject)Assembly.Load(path).CreateInstance(path+".DbObject");
如果你的資料層不是單獨的程式集,可以採用如下方法載入:
//使用與指定參數匹配程度最高的建構函式來建立指定類型的執行個體string path = System.Configuration.ConfigurationSettings.AppSettings["DAL"];string TypeName=path+".DbObject"Type objType = Type.GetType(TypeName,true);return (IDbObject)Activator.CreateInstance(objType);
見:http://blog.163.com/jiang_tao_2010/blog/static/1211268902009817324945/
自己的代碼: //Assembly assembly = Assembly.Load(webSiteShopCode); //var objGrab = (IGrab)assembly.CreateInstance(webSiteShopCode + ".Grab");
Type objType = Type.GetType(webSiteShopCode + ".Grab", true); var objGrab = (IGrab)Activator.CreateInstance(objType); ; var product = objGrab.GetProInfo(createdTime, webSiteShopCode, i, url);
動態建立對象