关于Assembly.CreateInstance()与Activator.CreateInstance()方法
于Assembly.CreateInstance()与Activator.CreateInstance()方法
动 态创建类对象,大多是Activator.CreateInstance()和Activator.CreateInstance<T>() 方法,非常好用,一般都用了Assembly.Load("AssemblyName").CreateInstance ("ClassName");的方法,研究一下这两者到底有什么区别,在msdn里,查到了两个方法的介绍:
Assembly.CreateInstance 方法 (String)
使用区分大小写的搜索,从此程序集中查找指定的类型,然后使用系统激活器创建它的实例。
Activator.CreateInstance 方法 (Type)
使用与指定参数匹配程度最高的构造函数来创建指定类型的实例。
看完以后,忽然觉得说了跟没说一样。不知道是我文字理解能力有问题,还是它表达有问题。
于是,没办法,只好用Reflector看看源代码了。
System.Reflection.Assembly位于mscorlib.dll里,CreateInstance()方法的源码是这样的
System.Activator也位于mscorlib.dll里,CreateInstance()方法的
public object CreateInstance(string typeName, bool ignoreCase, BindingFlags bindingAttr, Binder binder, object[] args, CultureInfo culture, object[]
activationAttributes)
{
Type type1 = this.GetTypeInternal(typeName, false, ignoreCase, false);
if (type1 == null)
{
return null;
}
//注意一下这一句,晕。。。。这里居然调用了Activator.CreateInstance方法
return Activator.CreateInstance(type1, bindingAttr, binder, args, culture, activationAttributes);
}
源码如下
public
static object CreateInstance(Type type, BindingFlags bindingAttr,
Binder binder, object[] args, CultureInfo culture, object[]
activationAttributes)
{
object obj1;
if (type == null)
{
throw new ArgumentNullException("type");
}
if (type is TypeBuilder)
{
throw new NotSupportedException(Environment.GetResourceString("NotSupported_CreateInstanceWithTypeBuilder"));
}
if ((bindingAttr & ((BindingFlags) 0xff)) == BindingFlags.Default)
{
bindingAttr |= BindingFlags.CreateInstance | BindingFlags.Public | BindingFlags.Instance;
}
if ((activationAttributes != null) && (activationAttributes.Length > 0))
{
if (!type.IsMarshalByRef)
{
throw new NotSupportedException(Environment.GetResourceString("NotSupported_ActivAttrOnNonMBR"));
}
if (!type.IsContextful && ((activationAttributes.Length > 1)
|| !(activationAttributes[0] is UrlAttribute)))
{
throw new NotSupportedException(Environment.GetResourceString("NotSupported_NonUrlAttrOnMBR"));
}
}
try
{
obj1 = ((RuntimeType)
type.UnderlyingSystemType).CreateInstanceImpl(bindingAttr, binder, args,
culture, activationAttributes);
}
catch (InvalidCastException)
{
throw new ArgumentException(Environment.GetResourceString("Arg_MustBeType"), "type");
}
return obj1;
}
一个facade模式,就解决了问题,而System.Activator.CreateInstance()方法的代码,下次再研究,先把facade补习一下,呵呵。
===================================================================================
DALFactory默认是每一层封装到一个程序集(独立项目)组件里。通过反射机制创建对象实例。
//从程序集创建对象实例
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 bjType = Type.GetType(TypeName,true);
return (IDbObject)Activator.CreateInstance(objType);
http://www.cnblogs.com/xiaotao823/archive/2008/05/02/1179119.html
关于Assembly.CreateInstance()与Activator.CreateInstance()方法的更多相关文章
- Assembly.CreateInstance和Activator.CreateInstance
本来是在设计模式中的工厂方法,在实现抽象工厂时,用到了一直都不熟悉的反射. namespace Factory { public abstract class Factory { public abs ...
- C# Activator.CreateInstance()方法使用
C#在类工厂中动态创建类的实例,所使用的方法为: 1. Activator.CreateInstance (Type) 2. Activator.CreateInstance (Type, Objec ...
- (转) C# Activator.CreateInstance()方法使用
C#在类工厂中动态创建类的实例,所使用的方法为: 1. Activator.CreateInstance (Type) 2. Activator.CreateInstance (Type, Objec ...
- C#中Activator.CreateInstance()方法用法分析
本文实例讲述了C#中Activator.CreateInstance()方法用法. Activator 类 包含特定的方法,用以在本地或从远程创建对象类型,或获取对现有远程对象的引用. C#在类工厂中 ...
- Activator.CreateInstance 方法 (Type) 的用法
转自:http://www.cnblogs.com/lmfeng/archive/2012/01/30/2331666.html Activator.CreateInstance 方法 (Type) ...
- C# Activator.CreateInstance()
C#在类工厂中动态创建类的实例,所使用的方法为: 1. Activator.CreateInstance (Type) 2. Activator.CreateInstance (Type, Objec ...
- EF Core使用SQL调用返回其他类型的查询 ASP.NET Core 2.0 使用NLog实现日志记录 CSS 3D transforms cSharp:use Activator.CreateInstance with an Interface? SqlHelper DBHelper C# Thread.Abort方法真的让线程停止了吗? 注意!你的Thread.Abort方法真
EF Core使用SQL调用返回其他类型的查询 假设你想要 SQL 本身编写,而不使用 LINQ. 需要运行 SQL 查询中返回实体对象之外的内容. 在 EF Core 中,执行该操作的另一种方法 ...
- 注意Activator.CreateInstance两个重载方法的性能
今天扩展一个Type的扩展方法New: public static object New(this Type type, params object[] args) { Guard.ArgumentN ...
- cSharp:use Activator.CreateInstance with an Interface?
///<summary> ///数据访问工厂 ///生成時間2015-2-13 10:54:34 ///塗聚文(Geovin Du) /// (利用工厂模式+反射机制+缓存机制,实现动态创 ...
随机推荐
- [原创]软件质量保证圈QQ群:197915314
[原创]软件质量保证圈QQ群:197915314 软件质量保证圈QQ群:197915314,讨论软件工程.软件过程改进.软件质量保证等(非测试群)! 欢迎各位同学来,来时请自报家门,名片修改格式:sh ...
- VS2015 Apache Cordova第一个Android和IOS应用
前言 本人个人博客原文链接地址为http://aehyok.com/Blog/Detail/75.html. 个人网站地址:aehyok.com QQ 技术群号:206058845,验证码为:aehy ...
- SIFT 特征提取算法总结
原文链接:http://www.cnblogs.com/cfantaisie/archive/2011/06/14/2080917.html 主要步骤 1).尺度空间的生成: 2).检测尺度空间极 ...
- 如何成为一位优秀的创业CEO
英文原文:How to Be Startup CEO 编者按:本文来自 Ryan Allis,是一位来自旧金山的创业者和投资人.在 2003 年创立了 iContact,并任 CEO. 做创业公司的 ...
- ie8下jquery改变PNG的opacity出现黑边,ie6下png透明解决办法
目前互联网对于网页效果要求越来越高,不可避免的用到PNG图片,PNG分为几种格 式,PNG8 PNG24 PNG32,其中最常用的,也是显示效果和大小比较适中的则是PNG24,支持半透明,透明,颜色也 ...
- Mac前端抓包小工具Charles4.0下载
链接: https://pan.baidu.com/s/1skPxdNJ 密码: 7iwp 使用方法:安装完主程序后,将dmg包里charles.jar拖至/Applications/Charles. ...
- linux上挂载windows共享文件夹
linux上挂载windows共享文件夹 1.共享windows目录 挂载之前得创建一个有password的用户(当前用户也能够),并将你要挂载的目录进行共享,并赋予读写权限 如图. watermar ...
- 【分享】分享一个压缩 PNG 的网站 TinyPNG
TinyPNG 能做什么? TinyPNG 采用智能的有损压缩技术来减少你的 PNG 文件的文件大小.通过选择性地减少图像中的颜色数量,更少的字节用于存储数据.效果几乎是看不见的,但它在文件大小方面差 ...
- TP收集一些可以用的资源
http://www.thinkphp.cn/code/2184.html UI http://www.thinkphp.cn/code/2158.html 报名 http://www.th ...
- searchableselect不支持onchange的问题
1.找到jquery.searchableSelect.js 2.找到selectItem函数 修改里面的方法,加入自定义你要回调的函数 selectItem: function(item){ //L ...