日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

.net反射简介

發布時間:2025/5/22 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .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
{
????
/**//**//**////?<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

總結

以上是生活随笔為你收集整理的.net反射简介的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。