.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調用默認成員,而不需要傳遞調用成員的名稱。當需要綁定器但不需要特別的綁定行為時就可以使用它。

其它

還有一些對元素類型信息描述的類,ConstrutorInfo(構造函式)、MethodInfo(方法)、FieldInfo(欄位)、PropertyInfo(屬性)、EventInfo(事件)、MemberInfo(成員)、ParameterInfo(參數)。如果查詢得到了具有任何類型信息的實例,就可以獲得該類型中任意元素的類型信息,當然出於安全原因,不保證會得到程式集中的任何信息。

示例

類定義:
using System;
using System.Collections.Generic;
using System.Text;

namespace ReflectionSample
{
/**//**//**////
/// 說明:一個簡單的類
/// 作者:文野
/// 聯繫:stwyhm.cnblog.com
///
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;

/**//**//**////
/// 說明:一個簡單的使用反射示例
/// 作者:文野
/// 聯繫:stwyhm.cnblog.com
///
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創建一個實例)");

#endregion

動態調用構造函式動態調用構造函式#region 動態調用構造函式

// 調用無參構造
ConstructorInfo studentConstructor1 = classSampleType.GetConstructor(new Type[] { });
ClassSample s2 = studentConstructor1.Invoke(new object[] { }) as ClassSample;
Response.Write(s2.name + "");

// 調用有參構造
ConstructorInfo studentConstructor2 = classSampleType.GetConstructor(new Type[] { typeof(string) });
ClassSample s3 = studentConstructor2.Invoke(new object[] { "您調用了有參構造創建了一個類實例。" }) as ClassSample;
Response.Write(s3.name + "");

#endregion

反射方法反射方法#region 反射方法

// 調用非靜態方法
string returnValue1 = classSampleType.InvokeMember("PublicClassMethod", BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance, null, s1, new object[] { }) as string;
Response.Write(returnValue1 + "");

// 調用靜態方法
string returnValue2 = classSampleType.InvokeMember("StaticMethod", BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Static, null, s1, new object[] { }) as string;
Response.Write(returnValue2 + "");

// 調用私有方法
string returnValue3 = classSampleType.InvokeMember("PrivateClassMethod", BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Instance, null, s1, new object[] { }) as string;
Response.Write(returnValue3 + "");

#endregion

反射參數反射參數#region 反射參數

MethodInfo parameterMethod = classSampleType.GetMethod("ParameterMethod");
ParameterInfo[] PARAS = parameterMethod.GetParameters();
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() }));

#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 + "");

#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 + "");

#endregion
}
}

相關詞條

相關搜尋

熱門詞條

聯絡我們