博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
动态创建对象
阅读量:6470 次
发布时间:2019-06-23

本文共 2228 字,大约阅读时间需要 7 分钟。

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);

 

转载地址:http://qkcko.baihongyu.com/

你可能感兴趣的文章
值类型和引用类型
查看>>
查看外键属性
查看>>
[转]html5 Canvas画图教程(6)—canvas里画曲线之arcTo方法
查看>>
maven 常用插件
查看>>
朴素贝叶斯方法在乳腺肿块检测中的应用
查看>>
算法 (二分查找算法)
查看>>
java Date 当天时间戳处理
查看>>
wkhtmltopdf乱码解决方案
查看>>
C++学习笔记之syntax_2: C++ 预处理命令
查看>>
[css] line boxes
查看>>
Directx11教程(64) tessellation学习(6)-PN Triangles
查看>>
[leetcode-101-Symmetric Tree]
查看>>
Android Log日志
查看>>
CSS3 Border-color——W3CPlus http://www.w3cplus.com/content/css3-border-color
查看>>
莫比乌斯反演总结
查看>>
HDU 5934 强联通分量
查看>>
Vector类
查看>>
HTML基础知识
查看>>
【新题】ocp 062 2019年考试新题-3
查看>>
Python~迭代
查看>>