一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

C# 反射技術(shù)應(yīng)用

  反射(Reflection)是.NET中的重要機(jī)制,通過(guò)放射,可以在運(yùn)行時(shí)獲得.NET中每一個(gè)類(lèi)型(包括類(lèi)、結(jié)構(gòu)、委托、接口和枚舉等)的成員,包括方法、屬性、事件,以及構(gòu)造函數(shù)等。還可以獲得每個(gè)成員的名稱(chēng)、限定符和參數(shù)等。有了反射,即可對(duì)每一個(gè)類(lèi)型了如指掌。如果獲得了構(gòu)造函數(shù)的信息,即可直接創(chuàng)建對(duì)象,即使這個(gè)對(duì)象的類(lèi)型在編譯時(shí)還不知道。 

  1、.NET可執(zhí)行應(yīng)用程序結(jié)構(gòu) 

  程序代碼在編譯后生成可執(zhí)行的應(yīng)用,我們首先要了解這種可執(zhí)行應(yīng)用程序的結(jié)構(gòu)。

  應(yīng)用程序結(jié)構(gòu)分為應(yīng)用程序域—程序集—模塊—類(lèi)型—成員幾個(gè)層次,公共語(yǔ)言運(yùn)行庫(kù)加載器管理應(yīng)用程序域,這種管理包括將每個(gè)程序集加載到相應(yīng)的應(yīng)用程序域以及控制每個(gè)程序集中類(lèi)型層次結(jié)構(gòu)的內(nèi)存布局。

  程序集包含模塊,而模塊包含類(lèi)型,類(lèi)型又包含成員,反射則提供了封裝程序集、模塊和類(lèi)型的對(duì)象。我們可以使用反射動(dòng)態(tài)地創(chuàng)建類(lèi)型的實(shí)例,將類(lèi)型綁定到現(xiàn)有對(duì)象或從現(xiàn)有對(duì)象中獲取類(lèi)型,然后調(diào)用類(lèi)型的方法或訪問(wèn)其字段和屬性。反射通常具有以下用途。

  (1)使用Assembly定義和加載程序集,加載在程序集清單中列出模塊,以及從此程序集中查找類(lèi)型并創(chuàng)建該類(lèi)型的實(shí)例。
  (2)使用Module了解包含模塊的程序集以及模塊中的類(lèi)等,還可以獲取在模塊上定義的所有全局方法或其他特定的非全局方法。
  (3)使用ConstructorInfo了解構(gòu)造函數(shù)的名稱(chēng)、參數(shù)、訪問(wèn)修飾符(如pulic 或private)和實(shí)現(xiàn)詳細(xì)信息(如abstract或virtual)等。使用Type的GetConstructors或GetConstructor方法來(lái)調(diào)用特定的構(gòu)造函數(shù)。
  (4)使用MethodInfo了解方法的名稱(chēng)、返回類(lèi)型、參數(shù)、訪問(wèn)修飾符(如pulic 或private)和實(shí)現(xiàn)詳細(xì)信息(如abstract或virtual)等。使用Type的GetMethods或GetMethod方法來(lái)調(diào)用特定的方法。
  (5)使用FiedInfo了解字段的名稱(chēng)、訪問(wèn)修飾符(如public或private)和實(shí)現(xiàn)詳細(xì)信息(如static)等,并獲取或設(shè)置字段值。
  (6)使用EventInfo了解事件的名稱(chēng)、事件處理程序數(shù)據(jù)類(lèi)型、自定義屬性、聲明類(lèi)型和反射類(lèi)型等,添加或移除事件處理程序。
  (7)使用PropertyInfo了解屬性的名稱(chēng)、數(shù)據(jù)類(lèi)型、聲明類(lèi)型、反射類(lèi)型和只讀或可寫(xiě)狀態(tài)等,獲取或設(shè)置屬性值。
  (8)使用ParameterInfo了解參數(shù)的名稱(chēng)、數(shù)據(jù)類(lèi)型、是輸入?yún)?shù)還是輸出參數(shù),以及參數(shù)在方法簽名中的位置等。
  System.Reflection.Emit命名空間的類(lèi)提供了一種特殊形式的反射,可以在運(yùn)行時(shí)構(gòu)造類(lèi)型。

  反射也可用于創(chuàng)建稱(chēng)為類(lèi)型瀏覽器的應(yīng)用程序,使用戶能夠選擇類(lèi)型,然后查看有關(guān)選定類(lèi)型的信息。

  此外,Jscript等語(yǔ)言編譯器使用反射來(lái)構(gòu)造符號(hào)表。System.Runtime.Serialization命名空間中的類(lèi)使用反射來(lái)訪問(wèn)數(shù)據(jù)并確定要永久保存的字段,System.Runtime.Remoting命名空間中的類(lèi)通過(guò)序列化來(lái)間接地使用反射。

using System;
using System.Reflection;
namespace ReflectionExample
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
System.Console.WriteLine(
"列出程序集中的所有類(lèi)型");
Assembly a
= Assembly.LoadFrom("ReflectionExample.exe");
Type[] mytypes
= a.GetTypes();
foreach(Type t in mytypes)
{
System.Console.WriteLine ( t.Name );
}
System.Console.ReadLine();
System.Console.WriteLine(
"列出HelloWorld中的所有方法");
Type ht
= typeof(HelloWorld);
MethodInfo [] mif
= ht.GetMethods ();
foreach(MethodInfo mf in mif)
{
System.Console.WriteLine(mf.Name);
}
System.Console.ReadLine();
System.Console.WriteLine(
"實(shí)例化HelloWorld,并調(diào)用SayHello方法");
Object obj
= Activator.CreateInstance(ht);
string [] s = {"ZhenLei"};
Object objName
= Activator.CreateInstance(ht,s);
//BindingFlags flags = (BindingFlags.NonPublic | BindingFlags.Public |
// BindingFlags.Static | BindingFlags.Instance | BindingFlags.DeclaredOnly);
MethodInfo msayhello
= ht.GetMethod("SayHello");
msayhello.Invoke(obj,
null);
msayhello.Invoke(objName,
null);
System.Console.ReadLine();
}
}
}

NET技術(shù)C# 反射技術(shù)應(yīng)用,轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 国产精品一区二区久久精品涩爱 | 国产成人福利精品视频 | www一区二区三区 | 婷婷精品视频 | 国产成人免费高清视频网址 | 午夜黄色大片 | 又黄又爽又猛大片录像 | 一级做a爰片久久毛片看看 一级做a爰片久久毛片毛片 | 日韩色视频一区二区三区亚洲 | 日本老年人精品久久中文字幕 | 天堂成人精品视频在线观 | 国产精品每日更新 | 亚洲一道本 | 欧美透逼视频 | 天天做天天爱夜夜爽女人爽宅 | 国产三级毛片 | 98bb国产精品视频 | 伊人中文字幕在线观看 | 亚洲91在线 | 中文字幕一区二区精品区 | 另类小说图片 | 婷婷色中文字幕 | 中文字幕专区在线亚洲 | 国产www在线观看 | 国产成人久视频免费 | 久久亚洲综合网 | 91视频入口 | 网红主播大尺度精品福利视频 | 久久久久国产一级毛片高清片 | 91色在线观看国产 | 久久99草 | 久久精品国产在热久久2019 | 黄页网站在线播放 | 国产男女爱视频在线观看 | 国产一区二区不卡免费观在线 | 日本精品久久久久中文字幕 1 | 99pao在线视频成精品 | 亚洲第一区视频在线观看 | 91免费片| 色网址在线观看 | 黄色免费观看网站 |