注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

信息 灵感 创新

I? =Information,Inspiration,Innovation

 
 
 

日志

 
 
关于我

we are 5. Mathematics, Computation, Programming, Engineering, and Making fun of life.

网易考拉推荐

初探C#类反射  

2010-12-05 09:22:48|  分类: C# & .NET |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

    公共语言运行库加载器管理应用程序域,这些域在拥有相同应用程序范围的对象周围形成了确定边界。这种管理包括将每个程序集加载到相应的应用程序域以及控制每个程序集中类型层次结构的内存布局。程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性。

    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 编写的程序,运行效果如下:

初探C类反射 - 379910987 - 年轻人,要努力!!!

 下载地址在这里


 

  评论这张
 
阅读(2476)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016