• 利用C# 反射设计支持可扩展插件的应用程序


    1.设计接口类:

    public interface IBase
    {
         void Somefun();
    }

    2.设计扩展插件类:

    class PluginCls:IBase
    {
         public void Somefun()
         {
             Console.WriteLine("hello ,i am derived class");
          }
    }

    3.主程序设计:

    class Program
    {
          static void Main(string[] args)
          {
              Assembly asm = Assembly.LoadFile(@"....PluginCls.dll");
              Type[] clsTypes = asm.GetTypes();//可访问程序集所有定义的类型
              //Type[] clsTypes = asm.GetExportedTypes();//这个方法只能访问程序集公开定义的类型
              foreach (Type e in clsTypes)
              {
                if (e.IsClass && typeof(IBase).IsAssignableFrom(e))//兼容匹配
                 {
                   IBase mth = (IBase)Activator.CreateInstance(e);//类实例构造
                   mth.Somefun();//调用插件类的实现方法
                 }
              }
              Console.ReadKey();
            }
        }

    程序输出:

    image

    这样主应用程序可以加载由其他人员设计的插件,无需关心该插件所定义的新类型,只要插件按照给定的接口原则设计,

    主程序则可无缝加载。

    参考:《CLR via C#》第22章,第23章

    jeffrey大牛实现太屌了,写的书本本经典,墙裂推荐他的书!

  • 相关阅读:
    CentOS 5.5和5.6 安装后的网络配置
    CentOS 5.5 系统安全配置
    printk: messages suppressed
    “找不到出路的”vb6.0
    用户控件的烦扰
    rman恢复
    oracle数据字典
    oracle自关联表的子删父变功能实现
    oracle自治事务
    oracle表空间更名
  • 原文地址:https://www.cnblogs.com/sunbing/p/3891844.html
Copyright © 2020-2023  润新知