动态创建对象
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态创建对象相关的知识,希望对你有一定的参考价值。
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);
以上是关于动态创建对象的主要内容,如果未能解决你的问题,请参考以下文章
RecyclerView holder中的Android Google Maps动态片段
在动态 viewpager 片段中创建 recyclerviews
Android 逆向使用 Python 解析 ELF 文件 ( Capstone 反汇编 ELF 文件中的机器码数据 | 创建反汇编解析器实例对象 | 设置汇编解析器显示细节 )(代码片段