zoukankan      html  css  js  c++  java
  • 反射——1 通过反射写记事本插件

    知识:反射,接口,程序集
    写插件的主要步骤:
    1 在主程序的执行目录下新建一个文件夹plugins
    2 在主程序中遍历plugins中满足记事本接口的文件
    3 找到以后对使用dll对文本文件进行操作
    (主要通过1 反射获取dll文件的路径,以及元数据; 2 定义接口类型的变量调用接口中定义的方法)

    完整项目代码

    1 定义记事本接口

    namespace Iplugins
    {
        public interface IAddPlugins
        {
            string Name
            {
                get;
            }
    
            void startProgram(TextBox txtbox);
        }
    }
    View Code

    2 记事本主程序

    namespace _01Note
    {
        public partial class Form1 : Form
        {
    
            public Form1()
            {
                InitializeComponent();
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                //1 检查plugins目录下是否存在.dll文件
                //获取当前执行程序的目录
                string startPath = Assembly.GetExecutingAssembly().Location;
                string pluginsPath = Path.Combine(Path.GetDirectoryName(startPath), "plugins");//使用combine可以不用考虑“”
                //将所有dll文件路径保存在一个String数组中
                string[] dlls = Directory.GetFiles(pluginsPath, "*.dll");
    
                //2 plugins目录下是否存在.dll文件存在
                //2.1加载plugins目录下的程序集
                foreach (string item in dlls)
                {
                    Assembly asem = Assembly.LoadFile(item);
                    //获取所有的public类型
                    Type[] dllsType = asem.GetExportedTypes();
                    //获取接口类型
                    Type IpluginsType = typeof(IAddPlugins);
    
                    //循环遍历遍历每一个dll文件中的类型是否实现了IPlugins接口
                    foreach (Type dllsTypeItem in dllsType)
                    {
                        if (IpluginsType.IsAssignableFrom(dllsTypeItem) && !dllsTypeItem.IsAbstract)
                        {
                            IAddPlugins addPlugins = (IAddPlugins)Activator.CreateInstance(dllsTypeItem);
                            ToolStripItem tspItem = this.格式ToolStripMenuItem.DropDownItems.Add(addPlugins.Name);
                            //由于addPlugins是局部变量,可以通过tag属性,设置包含有关项的数据的对象。
                            tspItem.Tag = addPlugins;
                            //给菜单栏按钮添加事件
                            tspItem.Click += new EventHandler(tsp_click);
                        }
                    }
    
                }
            }
    
            private void tsp_click(object sender, EventArgs e)
            {
                ToolStripItem tsp = (ToolStripItem)sender;
                IAddPlugins addplugins = (IAddPlugins)tsp.Tag;
                addplugins.startProgram(textBox1);
            }
        }
    }
    View Code

    3 改变成大写插件

    namespace Plugins_changeUpper
    {
        public class changUpper : IAddPlugins
        {
            public string Name
            {
                get
                {
                    return "大写";
                }
            }
    
            public void startProgram(System.Windows.Forms.TextBox txtbox)
            {
                txtbox.Text = txtbox.Text.ToUpper();
            }
        }
    }
    View Code

    4 改变样式插件

    //类库代码
    
     public class ChangeStyle : IAddPlugins
        {
            public string Name
            {
                get
                {
                    return "改变样式";
                }
            }
    
            public void startProgram(TextBox txtbox)
            {
                Form1 styleForm = new Form1(txtbox);
                styleForm.Show();
            }
        }
    //窗体代码
     public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private TextBox _txtBox;
            public Form1(TextBox txtBox):this()
            {
                _txtBox = txtBox;
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                float fontSize = float.Parse(comboBox1.Text);
                _txtBox.Font = new Font(comboBox2.Text, fontSize);
                this.Close();
            }
        }
    View Code

    5 添加时间插件

    namespace Plugins_AddTime
    {
        public class AddTime : IAddPlugins
        {
            public string Name
            {
                get
                {
                    return "添加时间";
                }
            }
    
            public void startProgram(System.Windows.Forms.TextBox txtbox)
            {
                txtbox.Text += "
    ";
                txtbox.Text += "				"+DateTime.Now.ToString();
            }
        }
    }
    View Code
  • 相关阅读:
    redis系列之------过期策略
    总结与期盼
    服务不可用排查思路
    Spring Boot Starters到底怎么回事?
    redis系列之------主从复制
    redis系列之------对象
    redis系列之------数据库
    DirectX11 With Windows SDK--00 目录
    DirectX11 With Windows SDK--34 位移贴图
    DirectX11 With Windows SDK--33 曲面细分阶段(Tessellation)
  • 原文地址:https://www.cnblogs.com/lv-sally/p/4727131.html
Copyright © 2011-2022 走看看