Board logo

标题: .net的反射机制(2) [打印本页]

作者: look_w    时间: 2019-4-16 19:13     标题: .net的反射机制(2)

然后在解决方案里添加一个窗口






拉入两个按钮 每个按钮执行一个反射函数:reflectorDemo()执行类库中的函数, reflectorInfo()遍历出类库中所有的方法,属性,类型。


代码如下:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Reflection;
    using ReflectorTest;
     
     
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
     
     
            private void button1_Click(object sender, EventArgs e)
            {
                reflectorDemo();
            }
     
     
            private void button2_Click(object sender, EventArgs e)
            {
                reflectorInfo();
            }
     
     
     
     
             public static void reflectorDemo()  
            {
     
     
                Assembly ass;
                Type type;
                MethodInfo method;
               try
                {
                    ass = Assembly.Load("ReflectorTest"); //根据命名空间加载
                    //ass = Assembly.LoadFile("ReflectorTest.DLL");根据文件名称尝试加载
                    type = ass.GetType("ReflectorTest.Test");//根据类型名称,反射出该类型(注意格式是:“命名空间.类名”)
                    object o =Activator.CreateInstance(type);//创建该类型的对象实例
                  
                   method=type.GetMethod("sayHello");//反射获取方法(实例方法)
                   string s = (string)method.Invoke(o,new string[] {"张三"});//调用实例方法
                   MessageBox.Show("调用实例方法返回:" + s);
     
                    method=type.GetMethod("noParm");//无参方法
                    s= (string) method.Invoke(o,null);//调用无参函数
                    MessageBox.Show("调用无参方法返回:" + s);  
     
     
                    //type.GetProperties()//获取该类型下面的所有公共属性            
     
                   method=type.GetMethod("staticMethod");//静态函数
                    s = (string)method.Invoke(null, new string[] { "张三" });//调用静态方法
                   MessageBox.Show("调用静态方法返回:"+s);
     
                   //根据指定的属性名称,获得属性值
                   type.GetProperty("Name").GetValue(o,null);
                    //给属性设值
                    type.GetProperty("Name").SetValue(o, "张三", null);
     
     
                }
                catch (Exception)
                {
                    throw;
                }
                finally
                {
                      ass=null;
                    type=null;
                    method=null;            
                }         
            }
            /// <summary>
            /// 利用反射获取程序集中类,类的成员(方法,属性等)
            /// </summary>
            public static void reflectorInfo()  
            {
                Assembly ass = Assembly.Load("ReflectorTest");
              //  Assembly ass = Assembly.LoadFrom("ReflectorTest.DLL");加载程序集
     
                Module[] modules = ass.GetModules();//模块信息   
                Type[] types = ass.GetTypes();//获取该程序集所包含的所有类型
                foreach (var item in types)
                {
                    MessageBox.Show("所包含的类型类型名称:" + item.Name);
                    MethodInfo[] methods = item.GetMethods();//获取该类型下所包含的方法信息
                    foreach (var method in methods)  
                    {
                        MessageBox.Show("该类下所包含的方法名称:" + method.Name);
              }
                    PropertyInfo[] PropertyInfo = item.GetProperties();
                    foreach (var pro in PropertyInfo)
                    {
                        MessageBox.Show("该类下所包含的属性名称:" + pro.Name);
                    }
                }
            }
        }
    }




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0