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

本文介绍了一种利用Activator.CreateInstance方法根据类名动态创建实例的技术,这种方法有助于提高程序的扩展性和灵活性,尤其适用于不确定具体子类类型的情况。通过示例展示了如何在不修改现有代码的情况下增加新的类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

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

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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值