C# 反射通过类名实例化类
2016-07-15 11:23
525 查看
在面向对象编程的时候,会遇到这样的问题,一个父类有多个子类,需要创建一个父类的对象,再后面根据条件去把该对象实例化具体的某个子类,然后进行操作。当然用if else 或者switch来做也可以,但是后期扩展性不好,特别是要把这些类封装成dll提供给被人用,更不合适了。这时候反射就提供了很好的解决方案。使用也很方便。
首先需要引入命名空间
加载程序集
根据条件实例化对象
下面是我自己使用的例子
这是初步封装的函数,后面更具需要进一步封装成需要的函数,调用上面函数是在IoManager类中。
在实际调用中,上面函数是在PluginBase类中。
这样就实现了,根据PluginBase父类下面子类的类名,和构造类所需要的TableInfo 参数,就能将PluginBase的对象实例化PluginBase下面子类的实例。
首先需要引入命名空间
using System.Reflection;
加载程序集
Assembly assembly = Assembly.LoadFile("程序集路径,不能是相对路径"); // 加载外部程序集(EXE 或 DLL) Assembly assembly = Assembly.GetExecutingAssembly(); // 加载当前程序集
根据条件实例化对象
// 创建类的实例,构造函数不带参数,返回为 object 类型,需要强制类型转换 object obj = assembly.CreateInstance(); // 创建类的实例,构造函数带参数,返回为 object 类型,需要强制类型转换 object obj = Assembly.GetExecutingAssembly().CreateInstance("类的完全限定名(即包括命名空间)", true, System.Reflection.BindingFlags.Default, null, 构造函数所需参数 object[]类型, null, null)
下面是我自己使用的例子
/// <summary> /// 创建对象实例 /// </summary> /// <typeparam name="T">要创建对象的类型</typeparam> /// <param name="nameSpace">类型所在命名空间</param> /// <param name="className">类型名</param> /// <param name="parameters">构造函数参数</param> /// <returns></returns> public static T CreateInstance<T>(string nameSpace,string className, object[] parameters) { try { string fullName = nameSpace + "." + className;//命名空间.类型名 object ect = Assembly.GetExecutingAssembly().CreateInstance(fullName, true, System.Reflection.BindingFlags.Default, null, parameters, null, null);//加载程序集,创建程序集里面的 命名空间.类型名 实例 return (T)ect;//类型转换并返回 } catch { //发生异常,返回类型的默认值 return default(T); } }
这是初步封装的函数,后面更具需要进一步封装成需要的函数,调用上面函数是在IoManager类中。
/// <summary> /// 根据类名创建具体插件的实例 /// </summary> /// <param name="className">插件类名,可以通过getPluginType函数获取 </param> /// <param name="tableInfo">构造插件实例所需的基本信息</param> /// <returns></returns> public static PluginBase CreateInstance(string className, TableInfo tableInfo) { object[] parameters = new object[1]; parameters[0] = tableInfo; return IoManager.CreateInstance<PluginBase>("DataTransformApplication.PluginManage", className, parameters); }
在实际调用中,上面函数是在PluginBase类中。
PluginBase NetPlugin = PluginBase.CreateInstance(this.PluginModelName,tableInfo);
这样就实现了,根据PluginBase父类下面子类的类名,和构造类所需要的TableInfo 参数,就能将PluginBase的对象实例化PluginBase下面子类的实例。
相关文章推荐
- Java反射随记
- c#调用COM组件
- AS3中的反射(速记) 分析
- C#实现把指定数据写入串口
- C#动态创建button的方法
- C#中抽象方法与虚拟方法的区别
- c#中虚函数的相关使用方法
- C#实现给图片加水印的方法
- C#使用加边法计算行列式的值
- C#实现多线程的同步方法实例分析
- C#中尾递归的使用、优化及编译器优化
- C#中的delegate委托类型基本学习教程
- C#实现子窗体与父窗体通信方法实例总结
- C#通用邮件发送类分享
- 举例讲解C#中自动实现的属性
- C#中this的用法集锦
- C#数据结构之顺序表(SeqList)实例详解
- C#.NET获取拨号连接的宽带连接方法
- C#异步绑定数据实现方法
- C#实现AddRange为数组添加多个元素的方法