用Activator .CreateInstance代替new实现类的实例化Assembly.CreateInstance()与Activator.CreateInstance()方法的区别

C# Activator 类使用详解 阅读详情

我一直想得到这样一个函数,输入一个类的名称为参数,返回一个相应的类的实例.

这在工厂模式中是非常有用的

这样,可以使程序有更高的扩展性,例如,,下面的例子

如果现在有一个类,专门用来计算交通工具的速度,不同的交通工具计算方法是不一样的,但是到底有那些交通工具是未知的或者是可变的,这种情况下,我们可能觉得要在添加交通工具的时候,需要修改用来计算速度的那个类,

但如果用Activator .CreateInstance创建实例,通过接口技术,则只要向程序集添加一个交通工具类,而不需要修改任何其它代码..实现了高扩展性.,

示例如下:

//接口:比如,在上例中,可以是交通工具必需实现的接口

using System;

namespace ActivatorCreateInstance
{
 /// <summary>
 /// IObjcet 的摘要说明。
 /// </summary>
 public interface IObjcet
 {
  void printName();
 }
}


//实现接口的类:比如在上例中,是交通工具类,这种类可以在扩展的时候添加,其它类的代码不用修改

using System;

namespace ActivatorCreateInstance
{
 /// <summary>
 /// ClassExam 的摘要说明。
 /// </summary>
 public class ClassExam:IObjcet
 {
  private string name="default name";
  public ClassExam()
  {
  
  }

  public ClassExam(string name)
  {
   this.name =name;
  }

  public void printName()
  {
   Console .WriteLine (this.ToString ()+"'s name is:");
  Console .WriteLine (this.name );

  }
  }
}

//程序入口:


namespace ActivatorCreateInstance
{
 /// <summary>
 /// main 的摘要说明。
 /// </summary>
 public class main
 {
  public main()
  {
  
  }

  public static void Main()
  {

//用传递参数来得到一个类的实例


   //用Activator .CreateInstance创建函数实例,默认的不带参数的构造函数
   IObjcet obj=(IObjcet)Activator .CreateInstance(System.Type .GetType ("ActivatorCreateInstance.ClassExam,ActivatorExample" ),null);
   //System.Type .GetType  命名空间.类名,程序集
   obj.printName();

   //调用ClassExam类的另一个带参数构造函数
   IObjcet obj2=(IObjcet)System.Activator .CreateInstance (System.Type .GetType ("ActivatorCreateInstance.ClassExam,ActivatorExample" ),new string []{"seted new name"});
   obj2.printName ();
  }
 }
}


---------------------------------------------------------------------------------------
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()方法的

 

出处:http://blog.youkuaiyun.com/huangjf_1983/archive/2009/09/07/4528018.aspx

C#中Activator.CreateInstance()方法用法分析 本文实例讲述了C#中Activator.CreateInstance()方法用法。分享给大家供大家参考。具体分析如下: Activator 类 包含特定的方法,用以在本地或从远程创建对象类型,或获取对现有远程对象的引用。 C#在类工厂中动态创建类的实例,所使用的方法为: 1. Activator.CreateInstance (Type) 2. Activator.CreateInstance (Type, Object[]) 两种方法区别仅为:创建无参数的构造方法和创建有参数的构造函数。 //Activator.CreateInstance(Type) object result = nu 立即下载

相关推荐

C# Log4Net不输出日志的解决方法

log4net是一个流行的 .NET 日志框架,用于记录应用程序的日志信息。如果你在使用log4net。

精通搬砖,资深技术砖家,在软件开发,人工智能,设备开发等领域都有研究。商业合作&交流学习可私信联系。 1263

C# Activator.CreateInstance()方法使用

今天在整理项目代码时,发现 有这样一段代码 object commandInstance = Activator.CreateInstance(commandType); 然后发现一直没有用过,查过资料后发现大概就是 Activator.CreateInstance :使用与指定参数匹配程度最高的构造函数来创建指定类型的实例。 public virtual void ExecuteCommand(INotification note) { Type commandType = null;

obf2018的博客 1万+

Win10 / Win11 启用 Hyper-V 虚拟机详细教程(图文+命令行全攻略)

摘要:本文详细介绍Windows10/11系统启用Hyper-V虚拟化平台的方法,包含专业版/企业版的图形界面和PowerShell命令行操作,以及家庭版通过脚本强制启用的特殊方案。内容涵盖版本支持对比、操作步骤图解、常见问题解答和性能优化建议,帮助开发者快速搭建虚拟化环境进行多系统测试。附微软官方文档参考链接和详细操作示意图。

ElioXu 7061

使用Activator.CreateInstance方法实例化对象

包含特定的方法,用以在本地或从远程创建对象类型,或获取对现有远程对象的引用。此类不能被继承。方法通过调用与指定参数最匹配的构造函数来创建程序集中定义的类型的实例。如果未指定参数,则调用不采用任何参数的构造函数,即无参数构造函数。

huaqianzkh的专栏 2286

银河麒麟V10离线升级OpenSSH实战:从编译到回滚全流程

OpenSSH作为Linux系统远程登录的核心组件,其版本升级直接关系到系统安全与等保合规。在信创环境下,银河麒麟V10自带的OpenSSH版本往往无法满足漏洞扫描与安全加固要求,而离线编译升级涉及依赖处理、编译参数、服务替换与回滚方案等多个技术环节。本文围绕银河麒麟V10(x86_64)平台,详细讲解OpenSSH离线升级的完整实操流程,包括环境摸底、依赖包安装、源码编译、配置文件兼容性处理、服务重启验证以及常见问题排查,并分享批量升级与安全加固的工程经验,帮助运维人员在不断网、不重装的前提下一次成功完成

weixin_30582943的博客 384

Asterisk中MixMonitor之支持接通后录音

一、概述 当我们使用开源的IPPBX(比如Elastix-2.5/4.0或者ISSABEL-4.0/FreePBX)的时候Outbound和Inbound路由(RingGroup/FollowMe)中有一个Call Recording选项,其值包括:Allow、Record immediately、Record On Answer和Nerver。当选择为Record On Answer,其实就是MixMonitor自带一个b选项。 尽管Asterisk自带的MixMoni...

宽简厚重—博约 1156

【C#】Activator.CreateInstance用法

今天在整理项目代码时,发现 有这样一段代码 LoaderBase loader = Activator.CreateInstance(Type.GetType(type,true)) as LoaderBase;原来 Activator.CreateInstance 一直没有使用过 查了一下MSDN 发现 Activator 类 包含用于在本地创建对象类型的方法。 无法继承此类。

阿黄的博客 3万+

Open3D点云算法与点云深度学习案例汇总(长期更新)

Open3D-python算法专栏文章汇总,长期更新算法原理与实战案例。

纵马踏花向自由 7467

关于Assembly.CreateInstance()与Activator.CreateInstance()方法

关于Assembly.CreateInstance()与Activator.CreateInstance()方法 动态创建类对象,大多是Activator.CreateInstance()和Activator.CreateInstance<T>()方法,非常好用,一般都用了Assembly.Load("AssemblyName").CreateInstance ("ClassName...

weixin_33885253的博客 842

超导电动悬浮系统一体化地面线圈电-热-力特性研究——基于ANSYS Maxwell与Workbench的多物理场联合仿真

摘要:超导电动悬浮(EDS)系统的地面线圈在运行中面临电-热-力多物理场强耦合挑战。本文基于ANSYS Maxwell和Workbench平台,提出一套联合仿真方法,对地面线圈进行高保真多物理场耦合分析。研究通过建立参数化三维电磁模型,计算瞬态涡流损耗和电磁力分布,并顺序耦合至热分析和结构分析,揭示电-热-力特性的相互影响机制。该方法为地面线圈的优化设计、材料选型和可靠性评估提供了理论依据和仿真工具支撑。 关键词:超导电动悬浮;地面线圈;多物理场耦合;联合仿真;ANSYS

huanghm88的专栏 375

零停机更新黑科技:Spring Boot应用实现无缝升级的实战指南

本文介绍了基于Spring Boot和Tomcat实现零停机更新的技术方案,通过动态端口切换和优雅关闭机制,确保服务更新过程中业务不中断。文章详细解析了核心原理,包括内嵌Tomcat的工作机制、零停机更新的三大技术基石(端口动态切换、优雅关闭和进程接管)。同时提供了完整的Java实现代码,重点展示了端口动态检查、参数动态调整、旧进程优雅终止等关键逻辑。该方案适用于高可用系统升级场景,能够有效避免传统部署方式导致的服务中断问题,实现100%无感知的应用更新。

墨夶的博客 818

.Net的反射中Assembly.CreateInstance()与Activator.CreateInstance()方法的区别

.Net的反射中Assembly.CreateInstance()与Activator.CreateInstance()方法的区别<br />个人理解:简单地说,Assembly.CreateInstance是经过封装的Activator.CreateInstance方法。前者在安全上更有保障一些,后者用途更广泛一些。<br />Assembly.CreateInstance 方法 (String)<br />使用区分大小写的搜索,从此程序集中查找指定的类型,然后使用系统激活器创建它的实例。<br />Ac

HJPror的专栏 4364

「UG/NX」Block UI 曲线收集器CurveCollector

曲线收集器块用于选择一条或多条曲线,包括通过选择意图连接的末端曲线链。曲线选择意图用于此块,但它不支持“交点处停止”、“跟随圆角”、“中间链”和“特征内链”等规则选项。

何曾参静谧的博客 1090

关于反射中Assembly.CreateInstance()与Activator.CreateInstance()方法

关于Assembly.CreateInstance()与Activator.CreateInstance()方法动态创建类对象,大多是Activator.CreateInstance()和Activator.CreateInstance()方法,非常好用,一般都用了Assembly.Load("AssemblyName").CreateInstance ("ClassName");的方法,研究

daydayup的专栏 1263

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

C# Activator和new的区别

1、你需要动态的创建一个实例模型的时候,就用Activator.CreateInstance(Type type);如果是明确的知道要创建哪个实例的模型,就可以用 new Class1()了。 T tInstance= (T)Activator.CreateInstance(typeof(T), new object[] { message }); 1 2、基于接口的Remoting对象是不能用...

LuckyJoey的博客 1064

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Assembly.CreateInstance()与Activator.CreateInstanc

关于Assembly.CreateInstance()与Activator.CreateInstance()方法 动态创建类对象,大多是Activator.CreateInstance()和 Activator.CreateInstance<T>()方法,非常好用,一般都用了 Assembly.Load("AssemblyName").CreateInstance ...

bangzhiqian8115的博客 136

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Assembly.CreateInstance()与Activator.CreateInstance()方法

转自:http://www.cnblogs.com/xiaotao823/archive/2008/05/02/1179119.html Assembly.CreateInstance()与Activator.CreateInstance()方法 动态创建类对象,大多是Activator.CreateInstance()和Activator.CreateInstance()

yueguanyun的专栏 2840

关于Assembly.CreateInstance()与Activator.CreateInstance()方法的区别

<br />关于Assembly.CreateInstance()与Activator.CreateInstance()方法的区别<br />呃``最近用惯了Activator.CreateInstance()和Activator.CreateInstance<T> (),非常好用,可是在看许多别人的源代码的时候,大多数用了 Assembly.Load("AssemblyName").CreateInstance("ClassName");的方法,忽然想研究一下这两者 到底有什么区别,于是,打开msd

802

Activator.CreateInstance与Assembly.CreateInsctance有什么区别?

Activator可以创建远程对象的实例,而Assembly必须先获得一个Assembly的实例,才能创建其内部Type的实例。Assembly     定义一个   Assembly,它是可重用、无版本冲突并且可自我描述的公共语言运行库应用程序构造块。     Assembly.CreateInstance   方法     从此程序集中查找某个类型,然后使用系统激活器创建

无名剑 1914
上一篇: 职业生涯步步高:一位资深经理人的职业生涯感悟【2】
下一篇: Activator.CreateInstance(T) 方法
aspnet2002web
博客等级 码龄21年 482粉丝 310原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值