C# 通过字符串类名新建对象

最近工作中遇到这样一个情况:

公司有各种型号的仪器仪表,他们都可以通过串口收发命令来实现某些相同的功能。例如读取某个数据,但是不同的型号收发的命令是不同的,例如A型号是仪器自动定时往串口发数据的,而B型号是需要上位机发命令过去后,仪器才会返回数据的。

于是,上位机会给用户一个下来菜单,当用户选中不同型号的产品的时候,收发的命令会相应调整。这时候一种方式是在主流程中加入Switch语句或if语句。 但这会导致主流程结构混乱,也不符合面向对象的思路。于是,决定写个接口,主流程中使用统一的方法获取数据。

类似这样:

public interface MyInterface{

      void Method();

}

public class Class1:MyInterface{

      public void Method(){

            xxxxxxxxx;

      }

}

 

public class Class2:MyInterface{

       public void Method(){

             yyyyyyyyyy;

       }

}

 

//主流程中

MyInterface myInterface;

if(xx){

      myInterface = new Class1();  //这里还是需要把所有的类名列在主流程里,当添加型号的时候,还是需要修改这个部分

}else{

     myInterface = new Class2();

}

myInterface.Method();

 

经过两天研究,通过System.Reflection.Assembly可以通过字符串实现新建对象(类似java的Class.forName)。未了描述详细点,这里分布写,实际代码可以写在一行上

Assembly assembly = Assembly.GetExecutingAssembly(); //获取包含当前代码的程序集

object o = assembly.CreateInstance("完整类名"); //这里所述的完整类名指的是包括名称空间,即:名称空间.类名

MyInterface myInterface = o as MyInterface; //强制类型转换

myInterface.Method();

 

PS:此方式仅限于要导入的类与当前代码在同一个程序集中时,当不在同一个程序集中,就需要使用Load载入Assembly.Load("MyDll")来获取Assembly对象。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值