zoukankan      html  css  js  c++  java
  • .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;
    }
    }
    }
    }

  • 相关阅读:
    里氏替换原则
    java简单选择排序
    通过登录窗体,登录不同的窗体,同时关闭登录窗体
    关于SQL中数据类型(float和real)和 .NET Framework 中数据类型(float和double)的问题
    129有确定性的有穷自动机
    大数据概述
    组合数据类型练习
    词法分析
    编译原理
    算法分析实验报告
  • 原文地址:https://www.cnblogs.com/tuncaysanli/p/2393727.html
Copyright © 2011-2022 走看看