反射 基於反射的簡單工廠

反射 訪問修飾符只是給編譯器看的,反射中能夠徹底操控到不管私有不私有
(GAC :Gobal Assemble Cache)全局程序集緩存
獲得assembly的方法
1.0*在當前運行目錄下面 加載對應的程序集
assembly ass1=assembly.load(「lib」)
2.0加載制定目錄下面的程序集
assembly.loadfile()或者loadfrom()
3.0加載當前運行程序域中的全部程序集
Assembly[] asss = AppDomain.CurrentDomain.GetAssemblies();
(GAC :Gobal Assemble Cache)全局程序集緩存
4.0經過當前對象得到當前運行的程序集
this.getType().assembly;
5.0經過type獲得運行的程序集
type t=typeof(...);
t.assembly;數組

獲得type的幾種方法
1.0經過typeof方法獲得type
Type t1 = typeof(Form1);
2.0根據對象獲得type
Person p = new Person();
Type t2 = p.GetType();
3.0根據程序集獲得對應的type
Assembly ass = Assembly.Load("Lib");
Type t3 = ass.GetType("Lib.GrilFriend");
4.0獲得當前程序集的全部Type
Type[] t4s = ass.GetTypes();
5.0獲得當前程序集中全部公共的type
Type[] t5s = ass.GetExportedTypes();緩存



反射建立對象兩種方式ide

1.0這兩種方式建立對象,類中必需要有無參數的構造函數
//0.0獲得運行的程序集
Assembly ass = Assembly.Load("Lib");
//1.0經過程序集來建立
object obj1 = ass.CreateInstance("Lib.GrilFriend");
//2.0經過Activator來建立對象
//獲得類對應的Type
Type type = ass.GetType("Lib.GrilFriend");
object obj2 = Activator.CreateInstance(type);
2.0如何建立類中沒有無參的構造函數的類的對象
//0.0獲得運行的程序集
Assembly ass = Assembly.Load("Lib");
//獲得類對應的Type
Type type = ass.GetType("Lib.GrilFriend");
//獲得當前類中的構造函數
ConstructorInfo cinfo = type.GetConstructor(new Type[] { typeof(string), typeof(int) });
//執行構造函數
object obj3 = cinfo.Invoke(new object[] { "劉亦菲", 28 });函數

 

使用反射實現記事本熱插拔插件。一個主記事本程序,我來規定接口,別人開發ui

插件,擺放到規定的文件夾位置
利用反射調用其中的方法來實現 大小寫切換功能。
接口規定了該插件功能名稱和插件功能。。。。一個只讀屬性一個大小寫轉換方法this

 

 1 using System;
 2 using System.Collections.Generic;
 3 using System.ComponentModel;
 4 using System.Data;
 5 using System.Drawing;
 6 using System.Linq;
 7 using System.Text;
 8 using System.Windows.Forms;
 9 
10 namespace 記事本
11 {
12     using System.Reflection;
13     public partial class Form1 : Form
14     {
15         public Form1()
16         {
17             InitializeComponent();
18         }
19 
20         private void Form1_Load(object sender, EventArgs e)
21         {
22             //定位到存放插件的位置
23             string basePath = AppDomain.CurrentDomain.BaseDirectory;
24             string phyPath = basePath + "Iplugs//";
25             //獲得全部插件位置字符串遍歷
26             string[] strs = System.IO.Directory.GetFiles(phyPath, "*.dll");
27             Type itype = typeof(IPlugs.Iplugs01);
28             if (strs.Length > 0)
29             {
30                 foreach (string item in strs)
31                 {
32                     //獲得程序集
33                     Assembly ass = Assembly.LoadFile(item);
34                     //獲得程序集中類數組遍歷
35                     Type[] types = ass.GetTypes();
36                     if (types.Length > 0)
37                     {
38                         foreach (var type in types)
39                         {
40                             //判斷實現了接口
41                             if (itype.IsAssignableFrom(type))
42                             { //根據type建立對象出來
43                                 object obj = Activator.CreateInstance(type);
44                                 //獲得屬性
45                                 PropertyInfo proinfo = type.GetProperty("Name");
46                                 //取出屬性值
47                                 object proobj = proinfo.GetValue(obj);
48                                 //給菜單來一個menuitem而且綁定一個點擊事件
49                                 ToolStripMenuItem stmi = new ToolStripMenuItem(proobj.ToString());
50                                 stmi.Tag = type;
51                                 stmi.Click += stmi_Click;
52                                 this.ms1.Items.Add(stmi);
53                             }
54                         }
55                     }
56                 }
57             }
58         }
59 
60         void stmi_Click(object sender, EventArgs e)
61         {
62             string txt = this.textBox1.Text;
63             ToolStripMenuItem stmi = sender as ToolStripMenuItem;
64             Type type = stmi.Tag as Type;
65             //獲得方法
66             MethodInfo methinfo = type.GetMethod("Process", new Type[] { typeof(string) });
67             //建立對象
68             object obj = Activator.CreateInstance(type);
69             //執行方法
70             object str = methinfo.Invoke(obj, new object[] { txt });
71             //返回值賦回
72             textBox1.Text = str.ToString();
73 
74         }
75     }
76 }
反射實現熱插拔插件
相關文章
相關標籤/搜索