zoukankan      html  css  js  c++  java
  • C#——反射动态创建类的实例

    “反射”其实就是利用程序集的元数据信息。 反射可以有很多方法,编写程序时请先导入 System.Reflection 命名空间。

    若要反射当前项目中的类(即当前项目已经引用它了),可以使用下面的写法。这种情况是我们项目中经常遇到的,主要作用就是解耦,便于项目后期拓展。

    首先在配置文件中添加appsetting节点:

    <appSettings>
      <add key="AssemblyPath" value="ConsoleApp11"/>
      <add key="NameSpace" value="ConsoleApp11"/>
      <add key="ClassName" value="Student"/>
    </appSettings>

    核心代码:

    private static readonly string assemblyName = ConfigurationManager.AppSettings["AssemblyPath"];//程序集
    private static readonly string nameSpace = ConfigurationManager.AppSettings["NameSpace"];//命名空间
    private static readonly string className = ConfigurationManager.AppSettings["ClassName"];//类名
    
    public static object CreateInstance(string assemblyName, string nameSpace, string className)
    {
        try
        {
            string fullName = nameSpace + "." + className;//命名空间.类型名
            object ect = Assembly.Load(assemblyName).CreateInstance(fullName);//加载程序集,创建程序集里面的 命名空间.类型名 实例
            return ect;//类型转换并返回    
        }
        catch (Exception ex) { Console.WriteLine(ex.Message + "===" + ex.StackTrace); return false; }
    }

    控制台调用:

    static void Main(string[] args)
    {
        IPerson ip = CreateInstance(assemblyName, nameSpace, className) as IPerson;
        ip.Say();
        Console.ReadKey();
    }

    其中Student类是继承于接口IPerson,拥有Say()的方法:

    public interface IPerson { void Say(); }
    public class Student : IPerson { public void Say() { Console.WriteLine("我是学生...."); } }

    注释:利用接口和反射的方法某种程度达到了解耦的效果。假如有许多类:Teacher、Child等都继承于IPerson接口,此次项目结束时可能我们只需要Student类,不需要实现其他类的方法。但是一旦下次做更改的时候,就可以通过配置文件进行更改,快捷方便。

     参考:C# 利用反射根据类名创建类的实例对象

  • 相关阅读:
    Python学习之旅(十二)
    Python学习之旅(十一)
    Python学习之旅(十)
    Python学习之旅(十)
    Python学习之旅(九)
    Python学习之旅(八)
    WPF 画刷应用
    WP8 学习 在APP.XAML中加入Resources
    WP8 学习 ApplicationBar 的创建 XAML代码
    WP8 学习 Onnavigatedto和OnnavigatedFrom的区别
  • 原文地址:https://www.cnblogs.com/wuqiuxue/p/7699856.html
Copyright © 2011-2022 走看看