用反射给触发器添加功能


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.Reflection;
using MyNotepadInterface;


namespace 反射记事本
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //主窗体加载的时候动态搜索addnos目录下的所有插件 并加载
            LoadPlugins();
        }

        private void LoadPlugins()
        {
            string path = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location),"addnos");

            //搜索该目录下的所有的程序集文件  这里就只搜索 *.dll文件

          string[] dlls= Directory.GetFiles(path,"*.dll");

            //动态加载每一个dll文件
          foreach (string  dllPah in dlls)
          {
              //加载每一个程序集
              Assembly assembly = Assembly.LoadFile(dllPah);
             
              //需要一个接口来进行约定
              Type typeIEditor =typeof(IEditor);
            
              //获取当前加载的程序集中的所有的public类型
              Type[] types = assembly.GetExportedTypes();

              //遍历判断哪个类型实现了该接口
              foreach (Type userType in types)
              {
                  //判断这个类型必须是实现了IEditor 接口的类型并且该类型必须不是抽象的
                  if (typeIEditor.IsAssignableFrom(userType)&&!userType.IsAbstract)
                  {
                      IEditor plugin = (IEditor)Activator.CreateInstance(userType);
                      //把插件的名称加载到菜单栏
                      ToolStripItem tsi =tmsiFormt.DropDownItems.Add(plugin.Name);

                      //把插件名称加载到菜单栏上

                      tsi.Click += tsi_Click;
                      tsi.Tag = plugin;

                  }
              }

          }
        }

        void tsi_Click(object sender, EventArgs e)
        {
            //菜单项的单击事件
            ToolStripItem tsi = sender as ToolStripItem;
            if (tsi !=null )
            {
                IEditor editorPlugin = tsi.Tag as IEditor;

                //运行该插件
                editorPlugin.Run(this.textBox1);
            }
        }
    }
}
---------------------------------------------------------------------



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace MyNotepadInterface
{

    public interface  IEditor
    {
      
       
     /// <summary>
    /// 一个只读属性 用来显示插件的名称
    /// </summary>
        string Name
        {
            get;
        }

        //这个方法就是插件中运行插件的方法
        void Run(TextBox txtBox);
    }
}


----------------------------------------------------------------

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MyNotepadInterface;

namespace MyNotepadPlugin.ToUpper
{
    public class ConvetTextToUpper:IEditor
    {
        #region IEditor 成员

        public string Name
        {
            get { return "转换大写"; }
        }

        public void Run(System.Windows.Forms.TextBox txtBox)
        {
           txtBox.Text=txtBox.Text.ToUpper();
        }
        #endregion

    }
}


猜你喜欢

转载自275055162.iteye.com/blog/2215177