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

一车,一房,一个温暖家

10万左右的车,80平方的房子,这是我奋斗的暖暖的家

 
 
 

日志

 
 

引用 .Net反射技术   

2015-03-28 08:56:14|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
本文转载自聪聪《.Net反射技术》

.net反射简介 - 概述
       反射就是动态发现类型信息的能力。它帮助程序设计人员在程序运行时利用一些信息去动态地使用类型,这些信息在设计时是未知的,这种能力类型于后期绑定。反射还支持的更高级的行为,能在运行时动态创建新类型,并且对这些新类型的操作进行调用。

.net反射简介 - 一些在反射中经常使用的类
Assembly类

      Assembly类是可重用、无版本冲突并且可自我描述的公共语言运行库应用程序构造块。可以使用Assembly.Load和Assembly.LoadFrom方法动态地加载程序集。

Type类

      反射的中心是System.Type类。System.Type类是一个抽象类,代表公用类型系统中的一种类型。这个类使您能够查询类型名、类型中包含的模块和名称空间、以及该类型是一个数值类型还是一个引用类型。
System.Type类使您能够查询几乎所有与类型相关的属性,包括类型访问限定符、类型是否、类型的COM属性等等。

Activator类

      Activator类支持动态创建.NET程序集和COM对象。可以通过CreateComInstanceFrom、CreateInstance、CreateInstanceFrom、GetObject四个静态方法加载COM对象或者程序集,并能创建指定类型的实例。

Binder类

      Binder类是一个用于执行类型转换的绑定器,Type对象的InvokeMember方法接受Binder对象,这个对象描述了如何将传递给InvokeMember的参数转换成方法实际需要的类型。
      Binder类是一个抽象类,要创建绑定器,需要重写方法BindToMethod、BindToField、SelectMehtod、SelectProperty和ChangeType。

DefaultMemberAttribute类

    DefaultMemberAttribute类用于类型并带有一个指明默认成员名称的字符串参数。能够通过InvokeMember调用默认成员,而不需要传递调用成员的名称。当需要绑定器但不需要特别的绑定行为时就可以使用它。


.net反射简介 - 其它
还有一些对元素类型信息描述的类,ConstrutorInfo(构造函数)、MethodInfo(方法)、FieldInfo(字段)、PropertyInfo(属性)、EventInfo(事件)、MemberInfo(成员)、ParameterInfo(参数)。如果查询得到了具有任何类型信息的实例,就可以获得该类型中任意元素的类型信息,当然出于安全原因,不保证会得到程序集中的任何信息。


.net反射简介 - 示例

 
1.类定义:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Models
{
    public class User
    {
        /// <summary>
        /// 字段
        /// </summary>
        public string Field;

        private int age;
        /// <summary>
        /// 属性:年龄
        /// </summary>
        public int Age
        {
            get { return age; }
            set { age = value; }
        }

        private string name;
        /// <summary>
        /// 属性:名称
        /// </summary>
        public string Name
        {
            get { return name; }
            set { name = value; }
        }

        /// <summary>
        /// 无参数构造函数
        /// </summary>
        public User()
        {
            this.name = "调用了无参数的构造函数";
        }

        /// <summary>
        /// 带参构造函数
        /// </summary>
        public User(string name)
        {
            this.Name = name;
           // this.Age = age;
        }

        /// <summary>
        /// public方法 
        /// </summary>
        public string PublicClassMethod()
        {
            return string.Format("您反射了一个Public方法");
        }

        /// <summary>
        /// private方法
        /// </summary>
        private string PrivateClassMethod()
        {
            return string.Format("您反射了一个Private方法");
        }

        /// <summary>
        /// static方法
        /// </summary>
        public static string StaticMethod()
        {
            return "您反射了一个Static方法";
        }

        /// <summary>
        /// 无带参方法
        /// </summary>
        public string Show1()
        {
            return string.Format("我的名字叫:{0},今年{1}岁了!", this.Name, this.Age);
        }

        /// <summary>
        /// 带参方法
        /// </summary>
        public string Show(string aihao)
        {
            return string.Format("大家好,我的爱好是:{0}!", aihao);
        }

        /// <summary>
        /// 自定义事件类型
        /// </summary>
        public event EventHandler eventHandler;

        /// <summary>
        /// 处理事件
        /// </summary>
        public void DoEvent()
        {
            eventHandler(null, EventArgs.Empty);
        }
    }
}

2.反射示例
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 Models;

namespace test
{
    public partial class Form3 : Form
    {
        public Form3()
        {
            InitializeComponent();
        }

        private void Form3_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (DialogResult.OK != MessageBox.Show("你确定要退出系统", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Information))
            {
                e.Cancel = true;
                //  MessageBox.Show(e.CloseReason.ToString());
            }
            else
            {

            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void btnOk_Click(object sender, EventArgs e)
        {
            //获取程序集
            Assembly assembly = Assembly.Load("Models");
            Assembly assembly2 = Assembly.LoadFrom("Models.dll");

            //从程序集中获取指定对象类型;
            Type type = assembly2.GetType("Models.User");

            //使用Activator创建一个实例使用Activator创建一个实例
            User user2 = Activator.CreateInstance(type) as User;
            //通过对象类型创建对象实例 
            User user = assembly.CreateInstance("Models.User") as User;

            // 调用无参构造
            ConstructorInfo studentConstructor = type.GetConstructor(new Type[] { });
            User user3 = studentConstructor.Invoke(new object[] { }) as User;

            //调用有参构造
            ConstructorInfo studentConstructor2 = type.GetConstructor(new Type[] { typeof(string) });
            User user4 = studentConstructor.Invoke(new object[] { "您调用了有参构造创建了一个类实例。"}) as User;

            //调用非静态方法
            string returnValue = type.InvokeMember("PublicClassMethod", BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance, null, user, new object[] { }) as string;

            // 调用静态方法 .      
            string returnValue2 = type.InvokeMember("StaticMethod", BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Static, null, user, new object[] { }) as string;

            // 调用私有方法 .      
            string returnValue3 = type.InvokeMember("PrivateClassMethod", BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Instance, null, user, new object[] { }) as string;


            //反射参数反射参数
            MethodInfo parameterMethod = type.GetMethod("Show");

            ParameterInfo[] paras = parameterMethod.GetParameters();
            for (int i = 0; i < paras.Length; i++)
            {
                MessageBox.Show(string.Format("参数名称:{0},参数类型:{1},是否可选:{2},位置:{3},默认值:{4}", paras[i].Name, paras[i].ParameterType.ToString(), paras[i].IsOptional.ToString(), paras[i].Position.ToString(), paras[i].DefaultValue.ToString()));

                //反射属性反射属性
                type.InvokeMember("Name", BindingFlags.SetProperty | BindingFlags.Public | BindingFlags.Instance, null, user, new object[] { "您反射了一个属性" });
                string returnValue4 = type.InvokeMember("Name", BindingFlags.GetProperty | BindingFlags.Public | BindingFlags.Instance, null, user, new object[] { }) as string;

                //反射字段反射字段
                type.InvokeMember("Field", BindingFlags.SetField | BindingFlags.Public | BindingFlags.Instance, null, user, new object[] { "您反射了一个字段" });
                string returnValue5 = type.InvokeMember("Field", BindingFlags.GetField | BindingFlags.Public | BindingFlags.Instance, null, user, new object[] { }) as string;
            }
        }
    }
}

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

历史上的今天

在LOFTER的更多文章

评论

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

页脚

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