c# 简单实现 插件模型 反射方式

利用反射方式实现插件模型,wpf控件作为插件,然后用另外的窗体加载。

首先定义插件接口:

    public interface IUserControlLevel1
    {
        string PluginName { get; set; }
        int PluginIndex { get; set; }
    }

userControl继承定义的接口:

    /// <summary>
    /// UserControl1.xaml 的交互逻辑
    /// </summary>
    public partial class UserControl1 : UserControl, IUserControlLevel1
    {
        public UserControl1()
        {
            InitializeComponent();
        }

        public string PluginName
        {
            get;
            set;
        }

        public int PluginIndex
        {
            get;
            set;
        }
    }

管理类里定义寻找插件,并返回结果。

主要代码如下:

   public static List<IUserControlLevel1> GetUserControlLevel1(string directoryPath)
        {
            List<IUserControlLevel1> li = new List<IUserControlLevel1>();
            string[] files = Directory.GetFiles(directoryPath, "*.dll");
            foreach (var file in files)
            {
                Assembly assembly = Assembly.LoadFrom(file);//加载控件
                Type[] types = assembly.GetTypes();//加载所有类型
                foreach (var type in types)
                {
                    if (!type.IsClass || type.IsNotPublic)
                    {
                        continue;
                    }
                    Type[] interfaces = type.GetInterfaces();//加载该类型接口

                    if (interfaces.Contains(typeof(IUserControlLevel1)))
                    {
                        object obj = Activator.CreateInstance(type);
                        IUserControlLevel1 uc = (IUserControlLevel1)obj;

                        Object obj2 = type.InvokeMember(type.FullName,
BindingFlags.CreateInstance, null, null, null);
                        IUserControlLevel1 uc2 = (IUserControlLevel1)obj2;

                        li.Add(uc2);
                        continue;
                    }
                }
            }
            return li;
        }

然后主窗体可以寻找默认路径下的插件 并加载到界面。

源码下载地址如下:

http://files.cnblogs.com/files/lizhijian/%E6%8F%92%E4%BB%B6%E6%A8%A1%E5%9E%8B.rar

时间: 2024-08-14 05:34:26

c# 简单实现 插件模型 反射方式的相关文章

模型配置方式实现爬虫

爬虫框架: DotnetSpider] [三] 模型配置方式实现爬虫 上一篇介绍了最基础的使用方法,也是最自由最灵活的方式,但是其实大多数情况下是可以用模型配置的方式实现一个爬虫的.我们做框架,肯定要尽可能的把一些重复性的工作帮你们做掉,当然灵活性等也会打折扣,但肯定有存在的意义. 另,爬虫已经对dotnet core rc2 做了适配,可以在dotnet core rc2环境下运行啦 定义数据对象类 [Schema("test", "sku", TableSuff

Ninject之旅之八:Ninject插件模型

摘要 在前面的章节中,我们看了在单一的绑定条件下Ninject能够处理依赖类型,就是说,每个服务类型只绑定到单一的实现类型.然而,有些情况下我们需要绑定一个抽象服务类型到多个实现,这叫多个绑定.多个绑定有两种情况.第一个是插件模型实现,另一个是上下文绑定.这篇文章介绍插件模型实现,下一篇文章介绍上下文绑定. 插件模型让一个应用程序获得很强的可扩展性而不用修改源代码.下面的例子,我们将实现一个音乐播放器应用程序,使用解码插件来支持不同的音乐格式.这个应用程序使用两个内置的解码器,也可以添加更多的解

学习笔记(九)Filter 完成一个简单的权限模型 HttpServletWrapper 和 HttpServletResponseWrapper

2. HttpServletWrapper 和 HttpServletResponseWrapper 1). Servlet API 中提供了一个 HttpServletRequestWrapper 类来包装原始的 request 对象,HttpServletRequestWrapper 类实现了 HttpServletRequest 接口中的所有方法, 这些方法的内部实现都是仅仅调用了一下所包装的的 request 对象的对应方法 //包装类实现 ServletRequest 接口. publ

Realm数据库的使用(一)数据库的简单介绍和模型的创建

Realm 是一种可以替代SQLite 和CoreData的移动端数据库 使用前提: iOS >= 7 or Mac OS X >= 10.9 Xcode >= 6 Both Objective-C & Swift are supported. 安装: 可通过CocoaPods加入项目中 pod serarch 'Realm' Realm浏览器/数据库管理器 可以通过工具查看和浏览数据 Xcode 插件: 一个可以快速创建Realm模型的插件 模型: Realm 数据模型其实就是

myeclipse安装svn插件的多种方式

开发者服务评测征文 十万现金悬赏大神 方法一:在线安装 1.打开HELP->MyEclipse Configuration Center.切换到SoftWare标签页. 2.点击Add Site 打开对话框,在对话框Name输入Svn,URL中输入:http://subclipse.tigris.org/update_1.6.x3.在左边栏中找到Personal Site中找到SVN展开.将Core SVNKit Library和Optional JNALibrary添加(右键Add to Pr

Unity3D ShaderLab 简单的立方体图反射

Unity3D ShaderLab 简单的立方体图反射 反射是着色器模拟现实环境的一个关键因素,它能使我们的着色器渲染效果更加具备视觉冲击,因为他利用了我们周围的环境, 让着色器反射外界的场景信息并将他们反射到材质表面来模拟外部环境,所以我们会使用立方图[CubeMap]的6张纹理来模拟环境的色彩情况. 首先,创建Shader,创建材质球,准备立方图,双击Shader,进入代码编辑器. 从Properties 到CGPROGRAM,再到surf,本次功能较为简单,先看代码. code start

Auto Layout简单应用——以编码的方式实现Auto Layout自动布局(二)

在上一篇文章iOS学习笔记02——以编码的方式实现Auto Layout自动布局(一)中我们简单的介绍了使用Visual Format Language创建布局约束来实现自动布局,这种方法创建的布局约束能够满足大部分的布局的需求.但是想要实现类似于这样的约束:button.width = 2 * button.height就不能满足要求了,这一篇我们我们简单介绍一下如何创建这样的布局约束. Apple就是非常贴心,它为我们提供了另外一个方法创建类似于view1.attr1 = view2.att

一个简单的MVC模型实现

function Event(sender) { this._sender = sender; this._listeners = []; } Event.prototype = { attach : function (listener) { this._listeners.push(listener); }, notify : function (args) { var index; for (index = 0; index < this._listeners.length; index

WordPress插件制作教程(二): 编写一个简单的插件

上一篇说到了如何创建一个插件,我想大家看了之后一定会有所收获,这一篇简单给大家写一个插件样例,让大家有一个基本的印象.这个插件的样例就是当你激活这个插件后会在你的每篇文章中插入一段自己定义好的内容,比如你想插入版权信息,订阅信息等等,下面就来简单写这个给每篇文章后面添加版权信息的方法.如下面代码: <?php /** * @package 添加版权信息 * @version 1.0 */ /* Plugin Name: 添加版权信息 Plugin URI: http://www.添加版权信息.c