反射
概述
反射就是动态发现类型信息的能力。它帮助程序设计人员在程序运行时利用一些信息去动态地使用类型,这些信息在设计时是未知的,这种能力类型于后期绑定。反射还支持的更高级的行为,能在运行时动态创建新类型,并且对这些新类型的操作进行调用。
一些在反射中经常使用的类
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调用默认成员,而不需要传递调用成员的名称。当需要绑定器但不需要特别的绑定行为时就可以使用它。
其它
还有一些对元素类型信息描述的类,ConstrutorInfo(构造函数)、MethodInfo(方法)、FieldInfo(字段)、PropertyInfo(属性)、EventInfo(事件)、MemberInfo(成员)、ParameterInfo(参数)。如果查询得到了具有任何类型信息的实例,就可以获得该类型中任意元素的类型信息,当然出于安全原因,不保证会得到程序集中的任何信息。
示例
类定义:
 using System;
using System; using System.Collections.Generic;
using System.Collections.Generic; using System.Text;
using System.Text;
 namespace ReflectionSample
namespace ReflectionSample {
{ /**//// <summary>
    /**//// <summary> /// 说明:一个简单的类
    /// 说明:一个简单的类 /// 作者:文野
    /// 作者:文野 /// 联系:stwyhm.cnblog.com
    /// 联系:stwyhm.cnblog.com /// </summary>
    /// </summary> public class ClassSample
    public class ClassSample {
    { // 默认构造
        // 默认构造 public ClassSample()
        public ClassSample() {
        { this.name = "您调用了默认构造创建了一个类实例。";
            this.name = "您调用了默认构造创建了一个类实例。"; }
        }
 // 带参构造
        // 带参构造 public ClassSample(string name)
        public ClassSample(string name) {
        { this.name = name;
            this.name = name; }
        }
 // 字段
        // 字段  public string name;
        public string name;
 public string Field;
        public string Field;
 // 属性
        // 属性 private string property;
        private string property; public string Property
        public string Property {
        { set { this.property = value; }
            set { this.property = value; } get { return property; }
            get { return property; } }
        }
 // public方法
        // public方法  public string PublicClassMethod()
        public string PublicClassMethod() {
        { return string.Format("您反射了一个Public方法");
            return string.Format("您反射了一个Public方法"); }
        }
 // private方法
        // private方法 private string PrivateClassMethod()
        private string PrivateClassMethod() {
        { return string.Format("您反射了一个Private方法");
            return string.Format("您反射了一个Private方法"); }
        }
 // static方法
        // static方法 public static string StaticMethod()
        public static string StaticMethod() {
        { return "您反射了一个Static方法";
            return "您反射了一个Static方法"; }
        }
 // 帶參方法
        // 帶參方法 public string ParameterMethod(string para)
        public string ParameterMethod(string para) {
        { return para;
            return para; }
        }
 public event EventHandler eventHandler;
        public event EventHandler eventHandler;
 public void DoEvent()
        public void DoEvent() {
        { eventHandler(null,EventArgs.Empty);
            eventHandler(null,EventArgs.Empty); }
        } }
    } }
}反射示例
 using System;
using System; using System.Data;
using System.Data; using System.Configuration;
using System.Configuration; using System.Web;
using System.Web; using System.Web.Security;
using System.Web.Security; using System.Web.UI;
using System.Web.UI; using System.Web.UI.WebControls;
using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts;
using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls;
using System.Web.UI.HtmlControls;
 using System.Reflection;
using System.Reflection; using ReflectionSample;
using ReflectionSample;
 /**//// <summary>
/**//// <summary> /// 说明:一个简单的使用反射示例
/// 说明:一个简单的使用反射示例 /// 作者:文野
/// 作者:文野 /// 联系:stwyhm.cnblog.com
/// 联系:stwyhm.cnblog.com /// </summary>
/// </summary> public partial class _Default : System.Web.UI.Page
public partial class _Default : System.Web.UI.Page {
{ protected void Page_Load(object sender, EventArgs e)
    protected void Page_Load(object sender, EventArgs e) {
    { string path = Server.MapPath(Request.Path);
        string path = Server.MapPath(Request.Path); string filePath = path.Substring(0, path.LastIndexOf('\\')) + @"\bin\ReflectionSample.dll";
        string filePath = path.Substring(0, path.LastIndexOf('\\')) + @"\bin\ReflectionSample.dll"; // 获取程序集
        // 获取程序集 Assembly classSampleAssembly = Assembly.LoadFrom(filePath);
        Assembly classSampleAssembly = Assembly.LoadFrom(filePath);
 // 从程序集中获取指定对象类型
        // 从程序集中获取指定对象类型 Type classSampleType = classSampleAssembly.GetType("ReflectionSample.ClassSample");
        Type classSampleType = classSampleAssembly.GetType("ReflectionSample.ClassSample");
 使用Activator创建一个实例使用Activator创建一个实例
        使用Activator创建一个实例使用Activator创建一个实例
 动态调用构造函数动态调用构造函数
        动态调用构造函数动态调用构造函数
 反射方法反射方法
        反射方法反射方法
 反射参数反射参数
        反射参数反射参数
 反射属性反射属性
        反射属性反射属性
 反射字段反射字段
        反射字段反射字段 }
    } }
} 
                     
                    
                 
                    
                


 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号