.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. 类定义:
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Text;
  5. namespace ReflectionSample
  6. {
  7.     /**//**//**//// 
  8.     /// 说明:一个简单的类
  9.     /// 作者:文野
  10.     /// 联系:stwyhm.cnblog.com
  11.     /// 
  12.     public class ClassSample
  13.     {
  14.         // 默认构造
  15.         public ClassSample()
  16.         {
  17.             this.name = "您调用了默认构造创建了一个类实例。";
  18.         }
  19.         // 带参构造
  20.         public ClassSample(string name)
  21.         {
  22.             this.name = name;
  23.         }
  24.         // 字段 
  25.         public string name;
  26.         public string Field;
  27.         // 属性
  28.         private string property;
  29.         public string Property
  30.         {
  31.             set { this.property = value; }
  32.             get { return property; }
  33.         }
  34.         // public方法 
  35.         public string PublicClassMethod()
  36.         {
  37.             return string.Format("您反射了一个Public方法");
  38.         }
  39.         // private方法
  40.         private string PrivateClassMethod()
  41.         {
  42.             return string.Format("您反射了一个Private方法");
  43.         }
  44.         // static方法
  45.         public static string StaticMethod()
  46.         {
  47.             return "您反射了一个Static方法";
  48.         }
  49.         // 帶參方法
  50.         public string ParameterMethod(string para)
  51.         {
  52.             return para;
  53.         }
  54.         public event EventHandler eventHandler;
  55.         public void DoEvent()
  56.         {
  57.             eventHandler(null,EventArgs.Empty);
  58.         }
  59.     }
  60. }
  61. 反射示例
  62. using System;
  63. using System.Data;
  64. using System.Configuration;
  65. using System.Web;
  66. using System.Web.Security;
  67. using System.Web.UI;
  68. using System.Web.UI.WebControls;
  69. using System.Web.UI.WebControls.WebParts;
  70. using System.Web.UI.HtmlControls;
  71. using System.Reflection;
  72. using ReflectionSample;
  73. /**//**//**//// 
  74. /// 说明:一个简单的使用反射示例
  75. /// 作者:文野
  76. /// 联系:stwyhm.cnblog.com
  77. /// 
  78. public partial class _Default : System.Web.UI.Page
  79. {
  80.     protected void Page_Load(object sender, EventArgs e)
  81.     {
  82.         string path = Server.MapPath(Request.Path);
  83.         string filePath = path.Substring(0, path.LastIndexOf(''//'')) + @"/bin/ReflectionSample.dll";
  84.         // 获取程序集
  85.         Assembly classSampleAssembly = Assembly.LoadFrom(filePath);
  86.         // 从程序集中获取指定对象类型
  87.         Type classSampleType = classSampleAssembly.GetType("ReflectionSample.ClassSample");
  88.         使用Activator创建一个实例使用Activator创建一个实例#region 使用Activator创建一个实例
  89.         // 通过对象类型创建对象实例
  90.         ClassSample s1 = Activator.CreateInstance(classSampleType) as ClassSample;
  91.         Response.Write(s1.name + "(使用Activator创建一个实例)");
  92.         #endregion
  93.         动态调用构造函数动态调用构造函数#region 动态调用构造函数
  94.         // 调用无参构造
  95.         ConstructorInfo studentConstructor1 = classSampleType.GetConstructor(new Type[] { });
  96.         ClassSample s2 = studentConstructor1.Invoke(new object[] { }) as ClassSample;
  97.         Response.Write(s2.name + "");
  98.         // 调用有参构造
  99.         ConstructorInfo studentConstructor2 = classSampleType.GetConstructor(new Type[] { typeof(string) });
  100.         ClassSample s3 = studentConstructor2.Invoke(new object[] { "您调用了有参构造创建了一个类实例。" }) as ClassSample;
  101.         Response.Write(s3.name + "");
  102.         #endregion
  103.         反射方法反射方法#region 反射方法
  104.         // 调用非静态方法
  105.         string returnValue1 = classSampleType.InvokeMember("PublicClassMethod", BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance, null, s1, new object[] { }) as string;
  106.         Response.Write(returnValue1 + "");
  107.         // 调用静态方法
  108.         string returnValue2 = classSampleType.InvokeMember("StaticMethod", BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Static, null, s1, new object[] { }) as string;
  109.         Response.Write(returnValue2 + "");
  110.         // 调用私有方法
  111.         string returnValue3 = classSampleType.InvokeMember("PrivateClassMethod", BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Instance, null, s1, new object[] { }) as string;
  112.         Response.Write(returnValue3 + "");
  113.         #endregion
  114.         反射参数反射参数#region 反射参数
  115.         MethodInfo parameterMethod = classSampleType.GetMethod("ParameterMethod");
  116.         ParameterInfo[] paras = parameterMethod.GetParameters();
  117.         for (int i = 0; i ", new object[] { paras[i].Name, paras[i].ParameterType.ToString(), paras[i].IsOptional.ToString(), paras[i].Position.ToString(), paras[i].DefaultValue.ToString() }));
  118.         #endregion
  119.         反射属性反射属性#region 反射属性
  120.         classSampleType.InvokeMember("Property", BindingFlags.SetProperty | BindingFlags.Public | BindingFlags.Instance, null, s1, new object[] { "您反射了一个属性" });
  121.         string returnValue4 = classSampleType.InvokeMember("Property", BindingFlags.GetProperty | BindingFlags.Public | BindingFlags.Instance, null, s1, new object[] { }) as string;
  122.         Response.Write(returnValue4 + "");
  123.         #endregion
  124.         反射字段反射字段#region 反射字段
  125.         classSampleType.InvokeMember("Field", BindingFlags.SetField | BindingFlags.Public | BindingFlags.Instance, null, s1, new object[] { "您反射了一个字段" });
  126.         string returnValue5 = classSampleType.InvokeMember("Field", BindingFlags.GetField | BindingFlags.Public | BindingFlags.Instance, null, s1, new object[] { }) as string;
  127.         Response.Write(returnValue5 + "");
  128.         #endregion
  129.     }
  130. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值