C# 反射通过类名实例化类

简介: 在面向对象编程的时候,会遇到这样的问题,一个父类有多个子类,需要创建一个父类的对象,再后面根据条件去把该对象实例化具体的某个子类,然后进行操作。

在面向对象编程的时候,会遇到这样的问题,一个父类有多个子类,需要创建一个父类的对象,再后面根据条件去把该对象实例化具体的某个子类,然后进行操作。当然用if else 或者switch来做也可以,但是后期扩展性不好,特别是要把这些类封装成dll提供给被人用,更不合适了。这时候反射就提供了很好的解决方案。使用也很方便。

  • 首先需要引入命名空间
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下面子类的实例。

目录
相关文章
|
20天前
|
存储 C# 索引
C# 一分钟浅谈:数组与集合类的基本操作
【9月更文挑战第1天】本文详细介绍了C#中数组和集合类的基本操作,包括创建、访问、遍历及常见问题的解决方法。数组适用于固定长度的数据存储,而集合类如`List<T>`则提供了动态扩展的能力。文章通过示例代码展示了如何处理索引越界、数组长度不可变及集合容量不足等问题,并提供了解决方案。掌握这些基础知识可使程序更加高效和清晰。
55 2
|
19天前
|
C# 数据安全/隐私保护
C# 一分钟浅谈:类与对象的概念理解
【9月更文挑战第2天】本文从零开始详细介绍了C#中的类与对象概念。类作为一种自定义数据类型,定义了对象的属性和方法;对象则是类的实例,拥有独立的状态。通过具体代码示例,如定义 `Person` 类及其实例化过程,帮助读者更好地理解和应用这两个核心概念。此外,还总结了常见的问题及解决方法,为编写高质量的面向对象程序奠定基础。
15 2
|
1月前
|
C#
C#中的类和继承
C#中的类和继承
34 6
|
1月前
|
Java C# 索引
C# 面向对象编程(一)——类
C# 面向对象编程(一)——类
27 0
|
1月前
|
开发框架 .NET 编译器
C# 中的记录(record)类型和类(class)类型对比总结
C# 中的记录(record)类型和类(class)类型对比总结
|
3月前
|
开发框架 .NET 编译器
程序与技术分享:C#基础知识梳理系列三:C#类成员:常量、字段、属性
程序与技术分享:C#基础知识梳理系列三:C#类成员:常量、字段、属性
25 2
|
3月前
|
C#
C# 版本的 计时器类 精确到微秒 秒后保留一位小数 支持年月日时分秒带单位的输出
这篇2010年的文章是从别处搬运过来的,主要包含一个C#类`TimeCount`,该类有多个方法用于处理时间相关的计算。例如,`GetMaxYearCount`计算以毫秒为单位的最大年数,`GetCurrentTimeByMiliSec`将当前时间转换为毫秒,还有`SecondsToYYMMDDhhmmss`将秒数转换为年月日时分秒的字符串。此外,类中还包括一些辅助方法,如处理小数点后保留一位数字的`RemainOneFigureAfterDot`。
|
3月前
|
存储 安全 C#
C# 类的深入指南
C# 类的深入指南
|
3月前
|
机器学习/深度学习 开发框架 .NET
技术经验解读:【c#】反射真的很可怕吗?
技术经验解读:【c#】反射真的很可怕吗?
|
4月前
|
C#
C#的类和对象的概念学习案例刨析
【5月更文挑战第17天】C#是一种面向对象的语言,以类和对象为核心。类作为对象的模板,定义了属性(如Name, Age)和行为(如Greet)。对象是类的实例,可设置属性值。封装通过访问修饰符隐藏实现细节,如Customer类的私有name字段通过Name属性访问。继承允许新类(如Employee)从现有类(Person)继承并扩展。多态让不同对象(如Circle, Square)共享相同接口(Shape),实现抽象方法Area,提供灵活的代码设计。
62 1