.net反射简介
概述
反射就是動態發現類型信息的能力。它幫助程序設計人員在程序運行時利用一些信息去動態地使用類型,這些信息在設計時是未知的,這種能力類型于后期綁定。反射還支持的更高級的行為,能在運行時動態創建新類型,并且對這些新類型的操作進行調用。
?
一些在反射中經常使用的類
Assembly類
Assembly類是可重用、無版本沖突并且可自我描述的公共語言運行庫應用程序構造塊??梢允褂肁ssembly.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.Collections.Generic;
using?System.Text;
namespace?ReflectionSample
{
????/**//**//**////?<summary>
????///?說明:一個簡單的類
????///?作者:文野
????///?聯系:stwyhm.cnblog.com
????///?</summary>
????public?class?ClassSample
????{
????????//?默認構造
????????public?ClassSample()
????????{
????????????this.name?=?"您調用了默認構造創建了一個類實例。";
????????}
????????//?帶參構造
????????public?ClassSample(string?name)
????????{
????????????this.name?=?name;
????????}
????????//?字段?
????????public?string?name;
????????public?string?Field;
????????//?屬性
????????private?string?property;
????????public?string?Property
????????{
????????????set?{?this.property?=?value;?}
????????????get?{?return?property;?}
????????}
????????//?public方法?
????????public?string?PublicClassMethod()
????????{
????????????return?string.Format("您反射了一個Public方法");
????????}
????????//?private方法
????????private?string?PrivateClassMethod()
????????{
????????????return?string.Format("您反射了一個Private方法");
????????}
????????//?static方法
????????public?static?string?StaticMethod()
????????{
????????????return?"您反射了一個Static方法";
????????}
????????//?帶參方法
????????public?string?ParameterMethod(string?para)
????????{
????????????return?para;
????????}
????????public?event?EventHandler?eventHandler;
????????public?void?DoEvent()
????????{
????????????eventHandler(null,EventArgs.Empty);
????????}
????}
}
反射示例
using?System;
using?System.Data;
using?System.Configuration;
using?System.Web;
using?System.Web.Security;
using?System.Web.UI;
using?System.Web.UI.WebControls;
using?System.Web.UI.WebControls.WebParts;
using?System.Web.UI.HtmlControls;
using?System.Reflection;
using?ReflectionSample;
/**//**//**////?<summary>
///?說明:一個簡單的使用反射示例
///?作者:文野
///?聯系:stwyhm.cnblog.com
///?</summary>
public?partial?class?_Default?:?System.Web.UI.Page
{
????protected?void?Page_Load(object?sender,?EventArgs?e)
????{
????????string?path?=?Server.MapPath(Request.Path);
????????string?filePath?=?path.Substring(0,?path.LastIndexOf('\\'))?+?@"\bin\ReflectionSample.dll";
????????//?獲取程序集
????????Assembly?classSampleAssembly?=?Assembly.LoadFrom(filePath);
????????//?從程序集中獲取指定對象類型
????????Type?classSampleType?=?classSampleAssembly.GetType("ReflectionSample.ClassSample");
????????使用Activator創建一個實例使用Activator創建一個實例#region?使用Activator創建一個實例
????????//?通過對象類型創建對象實例
????????ClassSample?s1?=?Activator.CreateInstance(classSampleType)?as?ClassSample;
????????Response.Write(s1.name?+?"(使用Activator創建一個實例)<br?/>");
????????#endregion
????????動態調用構造函數動態調用構造函數#region?動態調用構造函數
????????//?調用無參構造
????????ConstructorInfo?studentConstructor1?=?classSampleType.GetConstructor(new?Type[]?{?});
????????ClassSample?s2?=?studentConstructor1.Invoke(new?object[]?{?})?as?ClassSample;
????????Response.Write(s2.name?+?"<br?/>");
????????//?調用有參構造
????????ConstructorInfo?studentConstructor2?=?classSampleType.GetConstructor(new?Type[]?{?typeof(string)?});
????????ClassSample?s3?=?studentConstructor2.Invoke(new?object[]?{?"您調用了有參構造創建了一個類實例。"?})?as?ClassSample;
????????Response.Write(s3.name?+?"<br?/>");
????????#endregion
????????反射方法反射方法#region?反射方法
????????//?調用非靜態方法
????????string?returnValue1?=?classSampleType.InvokeMember("PublicClassMethod",?BindingFlags.InvokeMethod?|?BindingFlags.Public?|?BindingFlags.Instance,?null,?s1,?new?object[]?{?})?as?string;
????????Response.Write(returnValue1?+?"<br?/>");
????????//?調用靜態方法
????????string?returnValue2?=?classSampleType.InvokeMember("StaticMethod",?BindingFlags.InvokeMethod?|?BindingFlags.Public?|?BindingFlags.Static,?null,?s1,?new?object[]?{?})?as?string;
????????Response.Write(returnValue2?+?"<br?/>");
????????//?調用私有方法
????????string?returnValue3?=?classSampleType.InvokeMember("PrivateClassMethod",?BindingFlags.InvokeMethod?|?BindingFlags.NonPublic?|?BindingFlags.Instance,?null,?s1,?new?object[]?{?})?as?string;
????????Response.Write(returnValue3?+?"<br?/>");
????????#endregion
????????反射參數反射參數#region?反射參數
????????MethodInfo?parameterMethod?=?classSampleType.GetMethod("ParameterMethod");
????????ParameterInfo[]?paras?=?parameterMethod.GetParameters();
????????for?(int?i?=?0;?i?<?paras.Length;?i++)
????????????Response.Write(string.Format("您反射了一個帶參方法。參數名:{0},參數類型:{1},是不是可選參數:{2},參數位置:{3},默認值:{4}<br/>",?new?object[]?{?paras[i].Name,?paras[i].ParameterType.ToString(),?paras[i].IsOptional.ToString(),?paras[i].Position.ToString(),?paras[i].DefaultValue.ToString()?}));
????????#endregion
????????反射屬性反射屬性#region?反射屬性
????????classSampleType.InvokeMember("Property",?BindingFlags.SetProperty?|?BindingFlags.Public?|?BindingFlags.Instance,?null,?s1,?new?object[]?{?"您反射了一個屬性"?});
????????string?returnValue4?=?classSampleType.InvokeMember("Property",?BindingFlags.GetProperty?|?BindingFlags.Public?|?BindingFlags.Instance,?null,?s1,?new?object[]?{?})?as?string;
????????Response.Write(returnValue4?+?"<br?/>");
????????#endregion
????????反射字段反射字段#region?反射字段
????????classSampleType.InvokeMember("Field",?BindingFlags.SetField?|?BindingFlags.Public?|?BindingFlags.Instance,?null,?s1,?new?object[]?{?"您反射了一個字段"?});
????????string?returnValue5?=?classSampleType.InvokeMember("Field",?BindingFlags.GetField?|?BindingFlags.Public?|?BindingFlags.Instance,?null,?s1,?new?object[]?{?})?as?string;
????????Response.Write(returnValue5?+?"<br?/>");
????????#endregion
????}
}
轉載于:https://www.cnblogs.com/thx-bj/archive/2008/05/29/1209581.html
總結
- 上一篇: HTML结构化CSS网页布局入门指南
- 下一篇: 详解.Net中变量的命名和属性