关于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 objType = Type.GetType(TypeName,true);
return (IDbObject)Activator.CreateInstance(objType);

转载于:https://www.cnblogs.com/xiaotao823/archive/2008/05/02/1179119.html

关于Assembly.CreateInstance()与Activator.CreateInstance()方法相关推荐

  1. createinstance.java_C# Activator.CreateInstance()方法使用

    本文来自:http://blog.csdn.net/jaydawson/article/details/5539438 C#在类工厂中动态创建类的实例,所使用的方法为: 1. Activator.Cr ...

  2. createinstance.java,Activator.CreateInstance:类的动态实例化

    我正在设计一个松散耦合的结构.我想通过一个由String表示的代码来调用来自不同程序集/名称空间的类.我的设计是,每个客户端的业务规则都在不同的程序集上,并且彼此不依赖(一个客户端与一个DLL的比率) ...

  3. 使用Activator.CreateInstance完善简单工厂

    前几天在项目中看到别人的工厂类使用Activator.CreateInstance() 之前用简单工厂都是用switch ...case ,之前没有用过便查了查资料,正是这个方法+ 反射简化了工厂模式 ...

  4. activator.createinstance 需要垃圾回收么_Epsilon:你为什么需要一个不回收内存的垃圾回收器?...

    JDK 11中的JEP 318添加了一个名为Epsilon的垃圾回收器实现.Epsilon的特点是只负责分配内存,而不做任何垃圾回收操作.当堆内存空间就不够时,自动触发与OutOfMemoryErro ...

  5. .net byte转java byte_CVE20200688的武器化与.net反序列化漏洞那些事

    0x00 前言CVE-2020-0688是Exchange一个由于默认加密密钥造成的反序列化漏洞,该漏洞存在于Exchange Control Panel(ecp)中,不涉及Exchange的工作逻辑 ...

  6. 我们一起完成插件框架的设计与实现

    我们一起完成插件框架的设计与实现 原文:我们一起完成插件框架的设计与实现 开场一些题外话,今天登陆这个"小菜"的博客园,感触颇多."小菜"是我以前在QQ群里面的 ...

  7. 梦想成现实:用xUnit.net在单元测试中实现构造函数依赖注入

    英文关键词:Constructor Dependency Injection and Unit Testing(为了方便英文搜索) 自从博客园开发团队将开发架构迁移至DDD(领域驱动开发),就开始正式 ...

  8. 转【C#调用DLL的几种方法,包括C#调用C\C++\C#DLL】

    C#中dll调用方法 一.      DLL与应用程序 动态链接库(也称为DLL,即为"Dynamic Link Library"的缩写)是Microsoft Windows最重要 ...

  9. C# 利用反射调用类下的方法

    //1.Load(命名空间名称,即程序集),GetType(命名空间.类名) Type type = Assembly.Load("DapperNet").GetType(&quo ...

最新文章

  1. filter-mapping中的dispatcher使用
  2. 学习Java--JDK的下载安装和配置
  3. parkAndCheckInterrupt
  4. MAC终端安装grunt--javascript世界得构建工具
  5. React-引领未来的用户界面开发框架-读书笔记(七)
  6. cocos2dx游戏开发——捕鱼达人mini版学习笔记(一)——FishAchor的搭建
  7. C++操作符operator的另一种用法
  8. joystick手柄驱动安卓_万能手柄驱动(PPJOY) 官方版 (图文)
  9. 泊松分布 二项分布 正态分布之间的联系,与绘制高斯分布图
  10. Elasticsearch安装与分词插件、用户词典、同义词配置等
  11. 计算机考研408的算法题详解
  12. 大一计算机课如何做表格,电脑做表格的基本操作教程
  13. 搭建区块链浏览器——基于hyperledger fabric 1.0,MySQL容器
  14. 读书的5个秘诀 (余秋雨)
  15. html复选框代码隐藏勾勾,[译] 为什么 HTML 中复选框样式难写 — 本文给你答案
  16. PAT 1130 Infix Expression——什么才是DFS?由“柳神遍历”写法引发的思考
  17. WaveProgressBar -- 波浪进度条
  18. 多个接口可以封装成一个接口处理
  19. 登录页面ajax提交
  20. JS青蛙吃害虫小游戏

热门文章

  1. 类似美团的iOS地图定位及调用苹果系统导航
  2. 小米手机 说话声音小解决方法
  3. SQLSTATE 问题分析及解决·第四话
  4. 禅道测试用例自动化录入
  5. 称重仪表显示ol怎么解决_地磅称重仪表常见的故障及解决方法
  6. android三星拍照不够,三星拍照不行还说安卓机皇是三星,华为到底差哪儿了?...
  7. Mac 三步查看已连接过的wifi密码
  8. 8位院士入选!感动中国2022年度人物揭晓!
  9. PeopleSoft如何查找jar包冲突
  10. 五音不全?手把手教你用自己声音唱任何歌;最详细的Auto-GPT整理;4月AI绘画模型推荐;HayoAI平台简直太酷了 | ShowMeAI日报