System.Reflection 命名空间包含提供加载类型、方法和字段的有组织的视图的类和接口,具有动态创建和调用类型的功能。反射是用程序所提供的元数据来收集关于其类型信息的能力,他提供了封装程序集、模块和类型的对象(Type类型),具有在运行过程中动态地收集关于编译代码内部程序元素的能力,于是就有很多高级的功能,如使用反射动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型并调用其方法或访问其字段和属性。如果代码中使用了属性,可以利用反射对它们进行访问。
下面的例子演示使用 Assembly 定义和加载程序集,加载在程序集清单中列出的模块,以及从此程序集中查找类型并创建该类型的实例。只要要定义一个可重用、无版本冲突并且可自我描述的公共语言运行库应用程序构造块 Assembly,然后调用其GetType方法获取类型,并对每一个类型中的模块进行查询,根据位置添加到相应的节点下,代码清单如下:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Reflection; namespace Refraction//折射,呵呵 { public partial class Form1 : Form { private Type[] TypeArray; private Assembly Asse; private bool IsExpanded;
public Form1() { InitializeComponent(); treeView1.BorderStyle = BorderStyle.FixedSingle; IsExpanded = false; } private void button1_Click(object sender, EventArgs e) { try { OpenFileDialog ofd = new OpenFileDialog(); ofd.InitialDirectory = Application.ExecutablePath; ofd.Filter = "*.exe文件|*.exe|*.dll文件|*.dll"; if (ofd.ShowDialog() == DialogResult.OK) textBox1.Text = ofd.FileName; else return; string FileName = System.IO.Path.GetFileNameWithoutExtension(textBox1.Text); Asse = Assembly.LoadFrom(textBox1.Text); TypeArray = Asse.GetTypes(); treeView1.Nodes.Clear(); TreeNode TypeTree = new TreeNode("类型"); treeView1.BeginUpdate(); treeView1.Nodes.Add(FileName); int i = 0; foreach (Type t in TypeArray) { TreeNode ConstructorsTree = new TreeNode("构造函数"); ConstructorsTree.ImageIndex = 1; TreeNode FieldsTree = new TreeNode("字段"); FieldsTree.ImageIndex = 2; TreeNode MethodsTree = new TreeNode("方法"); MethodsTree.ImageIndex = 3; TreeNode PropertiesTree = new TreeNode("属性"); PropertiesTree.ImageIndex = 4; TreeNode EventsTree = new TreeNode("事件"); EventsTree.ImageIndex = 5; TypeTree.Nodes.Add(t.FullName); //构造函数 ConstructorInfo[] cons = t.GetConstructors(); foreach (ConstructorInfo con in cons) { ConstructorsTree.Nodes.Add(con.ToString()); } TypeTree.Nodes[i].Nodes.Add(ConstructorsTree); //字段 FieldInfo[] fies = t.GetFields(); foreach (FieldInfo fi in fies) { FieldsTree.Nodes.Add(fi.ToString()); } TypeTree.Nodes[i].Nodes.Add(FieldsTree); //方法 MethodInfo[] mets = t.GetMethods(); foreach (MethodInfo met in mets) { MethodsTree.Nodes.Add(met.ToString()); } TypeTree.Nodes[i].Nodes.Add(MethodsTree); //属性 PropertyInfo[] pros = t.GetProperties(); foreach (PropertyInfo pro in pros) { PropertiesTree.Nodes.Add(pro.ToString()); } TypeTree.Nodes[i].Nodes.Add(PropertiesTree); //事件 EventInfo[] eves = t.GetEvents(); foreach (EventInfo eve in eves) { EventsTree.Nodes.Add(eve.ToString()); } TypeTree.Nodes[i].Nodes.Add(EventsTree); i++;//下一个type } treeView1.Nodes[0].Nodes.Add(TypeTree); treeView1.EndUpdate(); //treeView1.ExpandAll();//展开全部节点 } catch { MessageBox.Show("加载出错", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } } private void button2_Click(object sender, EventArgs e) { if (!IsExpanded) { treeView1.ExpandAll(); IsExpanded = true; button2.Text = "折叠(&T)"; } else { treeView1.CollapseAll(); IsExpanded = false; button2.Text = "展开(&T)"; } } } } |
运行程序,加载一个采用.NET 编写的程序,运行效果如下:
下载地址在这里
评论