用Activator .CreateInstance代替new实现类的实例化

原创 2005年05月25日 11:15:00

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

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

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

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

但如果用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 ();

  }
 }
}


C#的Activator.CreateInstance方法

转载自:http://www.cnblogs.com/lmfeng/archive/2012/01/30/2331666.html Activator.CreateInstance 方法 (...

ApplicationContext接口常用实现类,在web中的实例化配置

1、Spring中加载ApplicationContext.xml文件的方式    Application contextconstructor通常使用字符串或字符串数组作为资源的定位路径(比如组成c...

python 7-1 如何派生内置不可变类型(int,str,tuple,float)并修改实例化行为,继承内置tuple并实现__new__

7-1 如何派生内置不可变类型(int,str,tuple,float)并修改实例化行为解决方案: 定义类IntTuple继承内置tuple,并实现new,修改实例化行为比如我们需要做一个定制化的浮...

使用new和反射产生java内部类的实例化对象

前两天看到一道面试题,是关于内部类的知识,觉得很有意思。 这道题是这样的: 根据注释填写(1),(2),(3)处的代码 public class Test{        pu...

ClassForName类装载与new实例化区别

java下Class.forName的作用是什么,为什么要使用它 Class.forName(xxx.xx.xx) 返回的是一个类 首先你要明白在java里面任何class都要装载在虚拟机上才能运行。...

JAVA的newInstance()和new的区别(JAVA反射机制,通过类名来获取该类的实例化对象)

1.在初始化一个类,生成一个实例的时候;newInstance() 和 new 有什么区别?      用newInstance与用new是区别的,区别在于创建对象的方式不一样,前者是使用类加载机制,...

c++类的实例化,有没有new的区别

A a; A * a = new a(); 以上两种方式皆可实现类的实例化,有new的区别在于: 1.前者在堆栈中分配内存,后者为动态内存分配,在一般应用中是没有什么区别的,但动态内存分...

Java实例化(new)的本质

1:寻找类定义   jvm会在自己的一个名叫“方法区”的内存块中,寻找名叫“MyObject”的Class对象(注意class也是一个对象,该对象记录了所有类的定义),如果有,则按照Class对象的...

Java使用new和反射实例化内部类对象

java使用new和反射实例化内部类对象 前两天看到一道面试题,是关于内部类的知识,觉得很有意思,现对其详细讲解,绝对原创!~ 这道题是这样的: 根据注释填写(1),(2),(3)处的代码 publi...

JavaScript的实例化与继承:请停止使用new关键字(转自infoQ)

JavaScript中的new关键字可以实现实例化和继承的工作,但个人认为使用new关键字并非是最佳的实践,还可以有更友好一些的实现。本文将介绍使用new关键字有什么问题,然后介绍如何对与new相关联...
  • flyonok
  • flyonok
  • 2013年11月29日 15:04
  • 949
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用Activator .CreateInstance代替new实现类的实例化
举报原因:
原因补充:

(最多只允许输入30个字)