国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

.Net 中的反射(動(dòng)態(tài)創(chuàng)建類(lèi)型實(shí)例)

2019-11-11 04:24:19
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

動(dòng)態(tài)創(chuàng)建對(duì)象

在前面節(jié)中,我們先了解了反射,然后利用反射查看了類(lèi)型信息,并學(xué)習(xí)了如何創(chuàng)建自定義特性,并利用反射來(lái)遍歷它。可以說(shuō),前面三節(jié),我們學(xué)習(xí)的都是反射是什么,在接下來(lái)的章節(jié)中,我們將學(xué)習(xí)反射可以做什么。在進(jìn)行更有趣的話(huà)題之前,我們先看下如何動(dòng)態(tài)地創(chuàng)建一個(gè)對(duì)象。

我們新建一個(gè)Console控制臺(tái)項(xiàng)目,叫做Reflection4(因?yàn)楸疚氖荘art4,你也可以起別的名字)。然后,添加一個(gè)示范類(lèi),本文中將通過(guò)對(duì)這個(gè)示范類(lèi)的操作來(lái)進(jìn)行說(shuō)明:

public class Calculator {    PRivate int x;    private int y;    public Calculator(){       x = 0;       y = 0;    }    public Calculator(int x,int y) {       this.x = x;       this.y = y;    }}

1.使用無(wú)參數(shù)構(gòu)造函數(shù)創(chuàng)建對(duì)象

上面這個(gè)類(lèi)非常簡(jiǎn)單,它包含兩個(gè)構(gòu)造函數(shù),一個(gè)是有參數(shù)的構(gòu)造函數(shù),一個(gè)是無(wú)參數(shù)的構(gòu)造函數(shù),我們先看看通過(guò)反射,使用無(wú)參數(shù)的構(gòu)造函數(shù)創(chuàng)建對(duì)象。創(chuàng)建對(duì)象通常有兩種方式,一種是使用Assembly的CreateInstance方法:

Assembly asm = Assembly.GetExecutingAssembly();          Object obj = asm.CreateInstance("Reflection4.Calculator",true);// 輸出:Calculator() invoked

CreateInstance的第一個(gè)參數(shù)代表了要?jiǎng)?chuàng)建的類(lèi)型實(shí)例的字符串名稱(chēng),第二個(gè)參數(shù)說(shuō)明是不是大小寫(xiě)無(wú)關(guān)(Ignore Case)。注意到CreateInstance返回的是一個(gè)Object對(duì)象,意味著如果想使用這個(gè)對(duì)象,需要進(jìn)行一次類(lèi)型轉(zhuǎn)換。

創(chuàng)建對(duì)象的另一種方式是調(diào)用Activator類(lèi)的靜態(tài)方法CreateInstance:

ObjectHandle handler = Activator.CreateInstance(null,"Reflection4.Calculator");Object obj = handler.Unwrap();

其中CreateInstance的第一個(gè)參數(shù)說(shuō)明是程序集的名稱(chēng),為null時(shí)表示當(dāng)前程序集;第二個(gè)參數(shù)說(shuō)明要?jiǎng)?chuàng)建的類(lèi)型名稱(chēng)。Activator.CreateInstance返回的是一個(gè)ObjectHandle對(duì)象,必須進(jìn)行一次Unwrap()才能返回Object類(lèi)型,進(jìn)而可以強(qiáng)制轉(zhuǎn)換成我們需要的類(lèi)型(本例中是Calculator)。ObjectHandle包含在System.Runtime.Remoting命名空間中,可見(jiàn)它是Remoting相關(guān)的,實(shí)際上ObjectHandle類(lèi)只是一個(gè)對(duì)原類(lèi)型進(jìn)行了一個(gè)包裝以便進(jìn)行封送,更多內(nèi)容可以參見(jiàn).Net Remoting(應(yīng)用程序域)—Part.1 這篇文章。

2.使用有參數(shù)構(gòu)造函數(shù)創(chuàng)建對(duì)象

如果我們想通過(guò)有參數(shù)的構(gòu)造函數(shù)創(chuàng)建對(duì)象,我們可以使用Assembly的CreateInstanc()的重載方法:

// 有參數(shù)構(gòu)造函數(shù)創(chuàng)建對(duì)象Assembly asm = Assembly.GetExecutingAssembly();Object[] parameters = new Object[2];    // 定義構(gòu)造函數(shù)需要的參數(shù)parameters[0] = 3;parameters[1] = 5;Object obj = asm.CreateInstance("Reflection4.Calculator",true, BindingFlags.Default, null, parameters, null, null);// 輸出:Calculator(int x,int y) invoked

我們看一下CreateInstance需要提供的參數(shù):

前兩個(gè)在前一小節(jié)已經(jīng)說(shuō)明過(guò)了;BindingFlags在前面我們也用到過(guò),它用于限定對(duì)類(lèi)型成員的搜索。在這里指定Default,意思是不使用BingdingFlags的策略(你可以把它理解成null,但是BindingFlags是值類(lèi)型,所以不可能為null,必須有一個(gè)默認(rèn)值,而這個(gè)Default就是它的默認(rèn)值);接下來(lái)的參數(shù)是Binder,它封裝了CreateInstance綁定對(duì)象(Calculator)的規(guī)則,我們幾乎永遠(yuǎn)都會(huì)傳遞null進(jìn)去,實(shí)際上使用的是預(yù)定義的DefaultBinder;接下來(lái)是一個(gè)Object[]數(shù)組類(lèi)型,它包含我們傳遞進(jìn)去的參數(shù),有參數(shù)的構(gòu)造函數(shù)將會(huì)使用這些參數(shù);接下來(lái)的參數(shù)是一個(gè)CultureInfo類(lèi)型,它包含了關(guān)于語(yǔ)言和文化的信息(簡(jiǎn)單點(diǎn)理解就是什么時(shí)候ToString("c")應(yīng)該顯示“¥”,什么時(shí)候應(yīng)該顯示“$”)。

動(dòng)態(tài)調(diào)用方法

接下來(lái)我們看一下如何動(dòng)態(tài)地調(diào)用方法。注意,本文討論的調(diào)用不是將上面動(dòng)態(tài)創(chuàng)建好的對(duì)象由Object類(lèi)型轉(zhuǎn)換成Calculator類(lèi)型再進(jìn)行方法調(diào)用,這和“常規(guī)調(diào)用”就沒(méi)有區(qū)別了,讓我們以.Net Reflection 的方式來(lái)進(jìn)行方法的調(diào)用。繼續(xù)進(jìn)行之前,我們?yōu)镃alculator添加兩個(gè)方法,一個(gè)實(shí)例方法,一個(gè)靜態(tài)方法:

public int Add(){    int total= 0;    total = x + y;    Console.WriteLine("Invoke Instance Method: ");    Console.WriteLine(String.Format("[Add]: {0} plus {1} equals to {2}", x, y, total));    return total;}public staticvoid Add(int x,int y){    int total = x + y;    Console.WriteLine("Invoke Static Method: ");    Console.WriteLine(String.Format("[Add]: {0} plus {1} equals to {2}", x, y, total));}

調(diào)用方法的方式一般有兩種:

在類(lèi)型的Type對(duì)象上調(diào)用InvokeMember()方法,傳遞想要在其上調(diào)用方法的對(duì)象(也就是剛才動(dòng)態(tài)創(chuàng)建的Calculator類(lèi)型實(shí)例),并指定BindingFlags為InvokeMethod。根據(jù)方法簽名,可能還需要傳遞參數(shù)。先通過(guò)Type對(duì)象的GetMethond()方法,獲取想要調(diào)用的方法對(duì)象,也就是MethodInfo對(duì)象,然后在該對(duì)象上調(diào)用Invoke方法。根據(jù)方法簽名,可能還需要傳遞參數(shù)。

需要說(shuō)明的是,使用InvokeMember不限于調(diào)用對(duì)象的方法,也可以用于獲取對(duì)象的字段、屬性,方式都是類(lèi)似的,本文只說(shuō)明最常見(jiàn)的調(diào)用方法。

1.使用InvokeMember調(diào)用方法

我們先看第一種方法,代碼很簡(jiǎn)單,只需要兩行(注意obj在上節(jié)已經(jīng)創(chuàng)建,是Calculator類(lèi)型的實(shí)例):

Type t = typeof(Calculator);int result = (int)t.InvokeMember("Add", BindingFlags.InvokeMethod,null, obj, null);Console.WriteLine(String.Format("The resultis {0}", result));輸出:Invoke Instance Method:[Add]: 3 plus 5 equals to 8The result is 8

在InvokeMember方法中,第一個(gè)參數(shù)說(shuō)明了想要調(diào)用的方法名稱(chēng);第二個(gè)參數(shù)說(shuō)明是調(diào)用方法(因?yàn)镮nvokeMember的功能非常強(qiáng)大,不光是可以調(diào)用方法,還可以獲取/設(shè)置 屬性、字段等。此枚舉的詳情可參看Part.2或者M(jìn)SDN);第三個(gè)參數(shù)是Binder,null說(shuō)明使用默認(rèn)的Binder;第四個(gè)參數(shù)說(shuō)明是在這個(gè)對(duì)象上(obj是Calculator類(lèi)型的實(shí)例)進(jìn)行調(diào)用;最后一個(gè)參數(shù)是數(shù)組類(lèi)型,表示的是方法所接受的參數(shù)。

我們?cè)诳匆幌聦?duì)于靜態(tài)方法應(yīng)該如何調(diào)用:

Object[] parameters2 = new Object[2];parameters2[0] = 6;parameters2[1] = 9;t.InvokeMember("Add", BindingFlags.InvokeMethod,null, typeof(Calculator), parameters2);輸出:Invoke Static Method:[Add]: 6 plus 9 equals to 15

我們和上面對(duì)比一下:首先,第四個(gè)參數(shù)傳遞的是 typeof(Calculator),不再是一個(gè)Calculator實(shí)例類(lèi)型,這很容易理解,因?yàn)槲覀冋{(diào)用的是一個(gè)靜態(tài)方法,它不是基于某個(gè)具體的類(lèi)型實(shí)例的,而是基于類(lèi)型本身;其次,因?yàn)槲覀兊撵o態(tài)方法需要提供兩個(gè)參數(shù),所以我們以數(shù)組的形式將這兩個(gè)參數(shù)進(jìn)行了傳遞。

2.使用MethodInfo.Invoke調(diào)用方法

我們?cè)倏聪碌诙N方式,先獲得一個(gè)MethodInfo實(shí)例,然后調(diào)用這個(gè)實(shí)例的Invoke方法,我們看下具體如何做:

Type t = typeof(Calculator);MethodInfo mi = t.GetMethod("Add", BindingFlags.Instance | BindingFlags.Public);mi.Invoke(obj, null);輸出:Invoke Instance Method:[Add]: 3 plus 5 equals to 8請(qǐng)按任意鍵繼續(xù). . .

在代碼的第二行,我們先使用GetMethod方法獲取了一個(gè)方法對(duì)象MethodInfo,指定BindingFlags為Instance和Public,因?yàn)橛袃蓚€(gè)方法都命名為“Add”,所以在這里指定搜索條件是必須的。接著我們使用Invoke()調(diào)用了Add方法,第一個(gè)參數(shù)obj是前面創(chuàng)建的Calculator類(lèi)型實(shí)例,表明在該實(shí)例上創(chuàng)建方法;第二個(gè)參數(shù)為null,說(shuō)明方法不需要提供參數(shù)。

我們?cè)倏聪氯绾问褂眠@種方式調(diào)用靜態(tài)方法:

Type t = typeof(Calculator);Object[] parameters2 = new Object[2];parameters2[0] = 6;parameters2[1] = 9;MethodInfo mi = t.GetMethod("Add", BindingFlags.Static | BindingFlags.Public);mi.Invoke(null, parameters2);// mi.Invoke(t, parameters2);   也可以這樣輸出:Invoke Static Method:[Add]: 6 plus 9 equals to 15

可以看到與上面的大同小異,在GetMethod()方法中,我們指定為搜索BindingFlags.Static,而不是BindingFlags.Public,因?yàn)槲覀円{(diào)用的是靜態(tài)的Add方法。在Invoke()方法中,需要注意的是第一個(gè)參數(shù),不能在傳遞Calculator類(lèi)型實(shí)例,而應(yīng)該傳遞Calculator的Type類(lèi)型或者直接傳遞null。因?yàn)殪o態(tài)方法不是屬于某個(gè)實(shí)例的。

NOTE:通過(guò)上面的例子可以看出:使用反射可以達(dá)到最大程度上的多態(tài),舉個(gè)例子,你可以在頁(yè)面上放置一個(gè)DropDownList控件,然后指定它的Items的value為你某個(gè)類(lèi)的方法的名稱(chēng),然后在SelectedIndexChanged事件中,利用value的值來(lái)調(diào)用類(lèi)的方法。而在以前,你只能寫(xiě)一些if else 語(yǔ)句,先判斷DropDownList返回的值,根據(jù)值再?zèng)Q定調(diào)用哪個(gè)方法。使用這種方式,編譯器在代碼運(yùn)行之前(或者說(shuō)用戶(hù)選擇了某個(gè)選項(xiàng)之前)完全不知道哪個(gè)方法將被調(diào)用,這也就是常說(shuō)的遲綁定(Late Binding)

Coding4Fun:遍歷System.Drawing.Color結(jié)構(gòu)

我們已經(jīng)講述了太多的基本方法和理論,現(xiàn)在讓我們來(lái)做一點(diǎn)有趣的事情:大家知道在asp.net中控件的顏色設(shè)置,比如說(shuō)ForeColor, BackColor等,都是一個(gè)System.Draw.Color結(jié)構(gòu)類(lèi)型。在某些情況下我們需要使用自定義的顏色,那么我們會(huì)使用類(lèi)似這樣的方式Color.FromRgb(125,25,13)創(chuàng)建一個(gè)顏色值。但有時(shí)候我們會(huì)覺(jué)得比較麻煩,因?yàn)檫@個(gè)數(shù)字太不直觀(guān)了,我們甚至需要把這個(gè)值貼到photoshop中看看是什么樣的。

這時(shí)候,我們可能會(huì)想要使用Color結(jié)構(gòu)提供的默認(rèn)顏色,也就是它的141個(gè)靜態(tài)屬性,但是這些值依然是以名稱(chēng),比如DarkGreen的形式給出的,還是不夠直觀(guān),如果能把它們以色塊的形式輸出到頁(yè)面就好了,這樣我們查看起來(lái)會(huì)方便的多,以后使用也會(huì)比較便利。我已經(jīng)實(shí)現(xiàn)了它,可以點(diǎn)擊下面的鏈接查看:

效果預(yù)覽:http://www.tracefact.net/demo/reflection/color.aspx

基本實(shí)現(xiàn)

現(xiàn)在我們來(lái)看一下實(shí)現(xiàn)過(guò)程:

先創(chuàng)建頁(yè)面Color.aspx(或其他名字),然后在Head里添加些樣式控制頁(yè)面顯示,再拖放一個(gè)Panel控件進(jìn)去。樣式表需要注意的是#pnColors div部分,它定義了頁(yè)面上將顯示的色塊的樣式;Id為pnHolder的Panel控件用于裝載我們動(dòng)態(tài)生成的div。

<head><style type="text/CSS">body{font-size:14px;}h1{font-size:26px;}#pnColors div{    float:left;width:140px;    padding:7px 0;    text-align:center;    margin:3px;     border:1px solid #aaa;    font-size:11px;    font-family:verdana, arial}</style></head><body>    <h1>Coding4Fun:使用反射遍歷System.Drawing.Color結(jié)構(gòu)</h1>    <form id="form1" runat="server">       <asp:Panel ID="pnColors" runat="server"></asp:Panel>    </form></body>

NOTE:如果將頁(yè)面命名為了 Color.aspx,那么需要在代碼后置文件中修改類(lèi)名,比如改成:Reflection_Color,同時(shí)頁(yè)面頂部也需要修改成Inherits="Reflection_Color",不然會(huì)出現(xiàn)命名沖突的問(wèn)題。

下一步的思路是這樣的:我們?cè)趐hColors中添加一系列的div,這些div也就是頁(yè)面上我們將要顯示的色塊。我們?cè)O(shè)置div的文本為 顏色的名稱(chēng) 和 RGB數(shù)值,它的背景色我們?cè)O(shè)為相應(yīng)的顏色(色塊的其他樣式,比如寬、邊框、寬度已經(jīng)在head中定義)。我們知道在Asp.Net中,并沒(méi)有一個(gè)Div控件,只有HtmlGenericControl,此時(shí),我們最好定義一個(gè)Div讓它繼承自HtmlGenericControl。

public class Div:HtmlGenericControl{    private string name;        public Div(Color c)       : base("div")    // 調(diào)用基類(lèi)構(gòu)造函數(shù),創(chuàng)建一個(gè) Div    {       this.name = c.Name;      // 顏色名稱(chēng)              // 設(shè)置文本       this.InnerHtml = String.Format("{0}<br />RGB({1},{2},{3})", name, c.R, c.G, c.B);       int total = c.R + c.G + c.B;       if (total <= 255)     // 如果底色太暗,前景色改為明色調(diào)           this.Style.Add("color", "#eee");       // 設(shè)置背景顏色       this.Style.Add("background",String.Format("rgb({0},{1},{2})", c.R, c.G, c.B));    }}

如同我們前面所描述的,這個(gè)Div接受一個(gè)Color類(lèi)型作為構(gòu)造函數(shù)的參數(shù),然后在構(gòu)造函數(shù)中,先設(shè)置了它的文本為 顏色名稱(chēng) 和 顏色的各個(gè)數(shù)值(通過(guò)Color結(jié)構(gòu)的R, G, B屬性獲得)。然后設(shè)置了div的背景色為相應(yīng)的RGB顏色。

NOTE:在上面 if(total<=255)那里,可能有的顏色本身就很暗,如果這種情況再使用黑色的前景色那么文字會(huì)看不清楚,所以我添加了判斷,如果背景太暗,就將前景色調(diào)的明亮一點(diǎn)。

OK,現(xiàn)在我們到后置代碼中只要做一點(diǎn)點(diǎn)的工作就可以了:

protected void Page_Load(object sender, EventArgs e){    List<Div> list = new List<Div>();    Type t = typeof(Color);      // 頁(yè)首已經(jīng)包含了 using System.Drawing;    // 獲取屬性    PropertyInfo[] properties = t.GetProperties(BindingFlags.Static | BindingFlags.Public);    Div div;    // 遍歷屬性    foreach (PropertyInfo p in properties)    {       // 動(dòng)態(tài)獲得屬性       Color c;                 c = (Color)t.InvokeMember(p.Name, BindingFlags.GetProperty, null, typeof(Color), null);                      div = newDiv(c);       list.Add(div);    }    foreach (Div item in list)   {       pnColors.Controls.Add(item);    }}

上面的代碼是很直白的:先創(chuàng)建一個(gè)Div列表,用于保存即將創(chuàng)建的色塊。然后獲取Color類(lèi)型的Type實(shí)例。接著我們使用GetProperties()方法,并指定BindingFlags獲取所有的靜態(tài)公共屬性。然后遍歷屬性,并使用InvokeMember()方法獲取了屬性值,因?yàn)榉祷氐氖且粋€(gè)Object類(lèi)型,所以我們需要把它強(qiáng)制轉(zhuǎn)換成一個(gè)Color類(lèi)型。注意在這里InvokeMember的BindingFlags指定為GetProperty,意為獲取屬性值。第四個(gè)參數(shù)為typeof(Color),因?yàn)轭伾珜傩?比如DarkGreen)是靜態(tài)的,不是針對(duì)于某個(gè)實(shí)例的,如果是實(shí)例,則需要傳遞調(diào)用此屬性的類(lèi)型實(shí)例。最后,我們根據(jù)顏色創(chuàng)建div,并將它加入列表,遍歷列表并逐一加入到Id為pnColors的Panal控件中。

現(xiàn)在已經(jīng)OK了,如果打開(kāi)頁(yè)面,應(yīng)該可以看到類(lèi)似這樣的效果:

為列表排序

上面的頁(yè)面看上去會(huì)比較亂,因?yàn)榱斜泶笾率前搭伾Q(chēng)排序的(Transparnet例外),我們最好可以讓列表基于顏色進(jìn)行排序。關(guān)于列表排序,我在 基于業(yè)務(wù)對(duì)象的排序 一文中已經(jīng)非常詳細(xì)地進(jìn)行了討論,所以這里我僅給出實(shí)現(xiàn)過(guò)程,而不再進(jìn)行講述。這一小節(jié)與反射無(wú)關(guān),如果你對(duì)排序已經(jīng)非常熟悉,可以跳過(guò)。

在頁(yè)面上添加一個(gè)RadioButtonList控件,將AutoPostBack設(shè)為true,我們要求可以按名稱(chēng)和顏色值兩種方式進(jìn)行排序:

排序:<asp:RadioButtonList ID="rblSort" runat="server" AutoPostBack="true" RepeatDirection="Horizontal" RepeatLayout="Flow">    <asp:ListItem Selected="True">Name</asp:ListItem>     <asp:ListItem>Color</asp:ListItem>        </asp:RadioButtonList>

在后置代碼中,添加一個(gè)枚舉作為排序的依據(jù):

public enum SortBy{    Name,         // 按名稱(chēng)排序    Color         // 暗顏色值排序}

修改Div類(lèi),添加 ColorValue字段,這個(gè)字段代表顏色的值,并創(chuàng)建嵌套類(lèi)型ColorComparer,以及方法GetComparer:

public class Div:HtmlGenericControl{    private int colorValue;    private string name;        public Div(Color c)       : base("div")    // 調(diào)用基類(lèi)構(gòu)造函數(shù),創(chuàng)建一個(gè) Div    {       this.name = c.Name;      // 顏色名稱(chēng)       this.colorValue =        // 顏色的色彩值           c.R * 256 * 256 + c.G * 256 + c.B;              // 設(shè)置文本       this.InnerHtml = String.Format("{0}<br />RGB({1},{2},{3})", name, c.R, c.G, c.B);       int total = c.R + c.G + c.B;       if (total <= 255)     // 如果底色太暗,前景色改為明色調(diào)           this.Style.Add("color", "#eee");       // 設(shè)置背景顏色       this.Style.Add("background",String.Format("rgb({0},{1},{2})", c.R, c.G, c.B));    }        // 返回一個(gè)Comparer()用于排序    public static ColorComparer GetComparer(SortBy sort) {       return new ColorComparer(sort);    }    // 默認(rèn)以名稱(chēng)排序    public static ColorComparer GetComparer() {       return GetComparer(SortBy.Name);    }        // 嵌套類(lèi)型,用于排序    public class ColorComparer : IComparer<Div>    {       private SortBy sort;       public ColorComparer(SortBy sort) {           this.sort = sort;       }       // 實(shí)現(xiàn)IComparer<T>接口,根據(jù)sort判斷以何為依據(jù)一進(jìn)排序       public int Compare(Div x, Div y)       {           if (sort == SortBy.Name)              return String.Compare(x.name, y.name);           else              return x.colorValue.CompareTo(y.colorValue);       }    }}

在Page_Load事件上面,我們添加語(yǔ)句,獲取當(dāng)前的排序依據(jù)(枚舉):

SortBy sort;if (!IsPostBack) {    sort = SortBy.Name;} else {    sort = (SortBy)Enum.Parse(typeof(SortBy), rblSort.SelectedValue);}

在將列表輸出到頁(yè)面之前,我們調(diào)用列表的Sort方法:

list.Sort(Div.GetComparer(sort));   // 對(duì)列表進(jìn)行排序foreach (Div item in list)   {    pnColors.Controls.Add(item);}

好了,所有工作都完成了,再次打開(kāi)頁(yè)面,可以看到類(lèi)似如下畫(huà)面,我們可以按照名稱(chēng)或者顏色值來(lái)對(duì)列表進(jìn)行排序顯示:

總結(jié)

本文分三個(gè)部分講述了.Net中反射的一個(gè)應(yīng)用:動(dòng)態(tài)創(chuàng)建對(duì)象和調(diào)用對(duì)象方法(屬性、字段)。我們先學(xué)習(xí)最常見(jiàn)的動(dòng)態(tài)創(chuàng)建對(duì)象的兩種方式,隨后分別討論了使用Type.InvokeMember()和MethodInfo.Invoke()方法來(lái)調(diào)用類(lèi)型的實(shí)例方法和靜態(tài)方法。最后,我們使用反射遍歷了System.Drawing.Color結(jié)構(gòu),并輸出了顏色值。

感謝閱讀,希望這篇文章能給你帶來(lái)幫助!

轉(zhuǎn)自:http://www.tracefact.net/CLR-and-Framework/Reflection-Part4.aspx


發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 马公市| 图片| 永和县| 陇川县| 汾阳市| 三明市| 都昌县| 深泽县| 紫阳县| 常熟市| 观塘区| 靖安县| 东乡族自治县| 镇平县| 海兴县| 泰来县| 洪湖市| 电白县| 汶川县| 巧家县| 香港| 白银市| 黄大仙区| 阜康市| 龙里县| 新余市| 西宁市| 东台市| 新营市| 中阳县| 长乐市| 鸡泽县| 枣庄市| 乌苏市| 香河县| 苗栗县| 兴宁市| 金湖县| 葫芦岛市| 新龙县| 东明县|