动态创建对象
C#主要支持 5 種動態(tài)創(chuàng)建對象的方式: 1. Type.InvokeMember 2. ContructorInfo.Invoke 3. Activator.CreateInstance(Type) 4. Activator.CreateInstance(assemblyName, typeName) 5. Assembly.CreateInstance(typeName) 最快的是方式 3 ,與 Direct Create 的差異在一個數(shù)量級之內(nèi),約慢 7 倍的水平。其他方式,至少在 40 倍以上,最慢的是方式 4 ,要慢三個數(shù)量級。 盡量NEW ,少反射
Assembly.CreateInstance()創(chuàng)建實例與New的區(qū)別 區(qū)別一: new是調(diào)用的newobj方法來直接實例化對象在托管堆上分配內(nèi)存的,編譯時確定的,并且編譯時進(jìn)行了類型檢查。 CreateInstance方法是通過調(diào)用程序集的元數(shù)據(jù),根據(jù)元數(shù)據(jù)描述來創(chuàng)建對象的,類型不安全的,但是它可以動態(tài)創(chuàng)建對象。優(yōu)勢應(yīng)該在于靈活吧。 區(qū)別二: Assembly.CreateInstance()是動態(tài)加載,即運行時創(chuàng)建類,編譯時不驗證類是否存在。 new是靜態(tài)加載。編譯時類已經(jīng)被編譯。
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");//這塊直接強制類型轉(zhuǎn)換就行 mm.Output(); }}interface ILoveMM{void Output();}class LoveMM : ILoveMM{public void Output(){Console.WriteLine("I love you MM");}}?
關(guān)于反射中Assembly.CreateInstance()與Activator.CreateInstance()方法的區(qū)別? msdn,查到了兩個方法的介紹: Assembly.CreateInstance 方法 (String) 使用區(qū)分大小寫的搜索,從此程序集中查找指定的類型,然后使用系統(tǒng)激活器創(chuàng)建它的實例。 Activator.CreateInstance 方法 (Type) 使用與指定參數(shù)匹配程度最高的構(gòu)造函數(shù)來創(chuàng)建指定類型的實例。
//從程序集創(chuàng)建對象實例 string path = System.Configuration.ConfigurationSettings.AppSettings["DAL"];//數(shù)據(jù)層的程序集名稱 return (IDbObject)Assembly.Load(path).CreateInstance(path+".DbObject");
如果你的數(shù)據(jù)層不是單獨的程序集,可以采用如下方法加載
//從程序集創(chuàng)建對象實例 string path = System.Configuration.ConfigurationSettings.AppSettings["DAL"];//數(shù)據(jù)層的程序集名稱 return (IDbObject)Assembly.Load(path).CreateInstance(path+".DbObject");如果你的數(shù)據(jù)層不是單獨的程序集,可以采用如下方法加載:
//使用與指定參數(shù)匹配程度最高的構(gòu)造函數(shù)來創(chuàng)建指定類型的實例 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);
?
轉(zhuǎn)載于:https://www.cnblogs.com/ChineseMoonGod/p/5190983.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
- 上一篇: Android运行Socket项目时出现
- 下一篇: 数字阅读体验的平台距离我们还有多远?