反射的方法操作记事本添加插件
本文主要讲的是通过反射动态获取插件。
首先所有的插件必须遵守规范,这个规范是一个接口,定义如下:
1 public interface IEditPlus//interface一定要加public,否则外部无法引用 2 { 3 string Name { get; }//插件的名字 4 void ChangeString(TextBox tb);//改变字符串的方法 5 }
主窗口的界面
主要的思路是查找/debug/lib文件夹下的所有的.dll文件,通过反射的方法对其进行操作。
(在菜单编辑下添加子菜单)
1 private void Form1_Load(object sender, EventArgs e) 2 { 3 //搜索/bin/*.dll 4 //获取当前程序集 5 Assembly ass = Assembly.GetExecutingAssembly(); 6 string dirPath = Path.Combine(Path.GetDirectoryName(ass.Location), "lib"); 7 string[] filePaths = Directory.GetFiles(dirPath, "*.dll");//在当前程序集的文件夹中搜索所有的dll文件 8 foreach (var filePath in filePaths) 9 { 10 Assembly assdll = Assembly.LoadFile(filePath); 11 Type[] tps = assdll.GetTypes(); 12 foreach (Type tp in tps) 13 { 14 if (typeof(IEditPlus).IsAssignableFrom(tp) && !tp.IsAbstract) 15 { 16 IEditPlus ep = (IEditPlus)Activator.CreateInstance(tp);//获取对象转换为接口对象 17 ToolStripItem tsi = tms.DropDownItems.Add(ep.Name);//为编辑菜单加载子菜单 18 tsi.Tag = ep;//将这个对象作为tsi的Tag保存 19 tsi.Click += tsi_Click;//为这个子列表添加单击事件 20 } 21 } 22 } 23 } 24 void tsi_Click(object sender, EventArgs e) 25 { 26 ToolStripItem tsi = sender as ToolStripItem;//将sender显示转换为toolstripitem 27 if (tsi!=null)//要判断下tsi不为null,因为sender是一个接受的对象 28 { 29 //在事件中要操作IEditPlus的ChangeString方法,所以要从tag中取出 30 IEditPlus ep = tsi.Tag as IEditPlus; 31 ep.ChangeString(textBox1); 32 } 33 34 }
小写转大写的dll文件代码---将生成的dll代码放在主程序的/debug/lib文件下
1 public class 小写转大写:IEditPlus 2 { 3 public void ChangeString(System.Windows.Forms.TextBox tb) 4 { 5 tb.Text = tb.Text.ToUpper(); 6 } 7 public string Name 8 { 9 get { return "小写转大写"; } 10 } 11 }
改变字体的dll代码---将生成的dll代码放在主程序的/debug/lib文件下
先添加一个窗体,界面
添加类的代码:
1 public void ChangeString(System.Windows.Forms.TextBox tb) 2 { 3 FontFm ff = new FontFm(tb); 4 ff.ShowDialog(); 5 } 6 public string Name 7 { 8 get { return "字体"; } 9 }
窗体的代码:
1 public FontFm() 2 { 3 InitializeComponent(); 4 } 5 public FontFm(TextBox tb):this() 6 { 7 this._tb = tb; 8 } 9 private TextBox _tb;//要操作TextBox tb添加字段和构造函数 10 private void button1_Click(object sender, EventArgs e) 11 { 12 _tb.Font = new Font(cbmFont.Text, float.Parse(cbmSize.Text));//改变字体 13 this.Close();//关闭窗体 14 }
我自己觉得,反射和接口一起用,棒棒哒!!!