.net的reflection (1)
發(fā)表時(shí)間:2024-02-19 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]在我的文章《C#基于接口的編程》中,我談?wù)摿耸褂贸橄蟮慕涌谧鳛榫幊谭独母鞣N優(yōu)點(diǎn)。分離接口和執(zhí)行過(guò)程,現(xiàn)在肯定不是新的思想,實(shí)際上它是com編程的核心。也許基于接口的在顯著的特征是多態(tài)性和即時(shí)檢查(RTTI).RTTI允許客戶(hù)端程序在運(yùn)行時(shí)訪(fǎng)問(wèn)對(duì)象。例如,如果一個(gè)對(duì)象執(zhí)行IAthlete接口,一個(gè)...
在我的文章《C#基于接口的編程》中,我談?wù)摿耸褂贸橄蟮慕涌谧鳛榫幊谭独母鞣N優(yōu)點(diǎn)。分離接口和執(zhí)行過(guò)程,現(xiàn)在肯定不是新的思想,實(shí)際上它是com編程的核心。也許基于接口的在顯著的特征是多態(tài)性和即時(shí)檢查(RTTI).RTTI允許客戶(hù)端程序在運(yùn)行時(shí)訪(fǎng)問(wèn)對(duì)象。例如,如果一個(gè)對(duì)象執(zhí)行IAthlete接口,一個(gè)客戶(hù)端程序能夠查找然后綁定這個(gè)接口用于調(diào)用和定位另一個(gè)接口。
查詢(xún)接口是強(qiáng)大的,是com+的基礎(chǔ)。同時(shí),它對(duì)能夠在一個(gè)對(duì)象上執(zhí)行接口導(dǎo)向又是極端有用的和明確必要的,這是.net一個(gè)特別重要的概念。在介紹這個(gè)概念之前,讓我們?cè)倩仡櫼恍┬畔㈥P(guān)于在.net中功能性和分布的基礎(chǔ)元素--集合。
在COM(+),組件展開(kāi)的邏輯和物理單元是一個(gè).dll文件。在.net平臺(tái)中,展開(kāi)的基礎(chǔ)單元是集合。與COM(+)組件不同的是一個(gè).net或許是有多個(gè)文件組成,盡管它被看作是一個(gè)單一的何不可分割的功能和執(zhí)行單元。一個(gè)集合文件也是自描述的,它包含被稱(chēng)之為中間語(yǔ)言的管制代碼和附加的元數(shù)據(jù),這個(gè)元數(shù)據(jù)給想綁定到這些代碼的客戶(hù)提供豐富的信息。.net的每個(gè)集合是著名的清單數(shù)據(jù)結(jié)構(gòu)。清單包含下列信息:
1、姓名和版本信息
2、其它集合的參考信息
3、安全邊界的信息。
4、集合中所有類(lèi)型的信息
毫無(wú)疑問(wèn),集合清單類(lèi)似于COM(+)的類(lèi)型庫(kù)。清單有在類(lèi)型庫(kù)中不存在的優(yōu)點(diǎn)。這個(gè)超過(guò)了這一課的范圍,我們將在這篇文章的第二部分進(jìn)行講述。被利用.net集合的客戶(hù)端程序?qū)⒁褂们鍐。因(yàn)槊總(gè)集合包含元數(shù)據(jù)的許多信息,客戶(hù)程序在運(yùn)行時(shí)能夠得到集合的內(nèi)容。這個(gè)過(guò)程就叫做reflection.Reflection不僅能夠查詢(xún)基礎(chǔ)類(lèi),而且運(yùn)行時(shí)能動(dòng)態(tài)調(diào)用方法,甚至于輸出能夠直接執(zhí)行的IL代碼。在你的代碼中有兩種方法來(lái)使用reflection,Reflection API 和 System.Reflection 名字空間。System.reflection是極端負(fù)責(zé)的,它包含將近40個(gè)類(lèi)。在文章的其他部分,我將介紹reflection的基礎(chǔ),如何用它區(qū)查詢(xún)集合類(lèi),方法,以及運(yùn)行時(shí)調(diào)用方法的類(lèi)型。為了示范在.net中的reflection名字空間,我將用下面的"reflection"類(lèi)來(lái)說(shuō)明:
// Reflect.cs
namespace CSharpReflectionSamples
{
using System;
/// <summary>
/// The reflect class will be used to demonstrate the basics of
/// .NET reflection. This class contains private member vars,
/// a constructor, a sample method, and sample accessor methods.
/// </summary>
public class Reflect
{
// private member variables
private int intTest;
private string strTest;
// constructor
public Reflect(int intData)
{
// constructor logic
intTest = intData;
}
// basic method
public int AMethod(int intData)
{
return intData*intData;
}
public string S
{
get
{
// return member var
return strTest;
}
set
{
// set member var
S = value;
}
}
}
}
正如你所看到的那樣,這個(gè)類(lèi)包含一個(gè)構(gòu)造器,一個(gè)例子方法,一個(gè)例子存取方法(得到和設(shè)置)。在System.Reflaction 名字空間核心是一個(gè)名為type的類(lèi)。這個(gè)type類(lèi)型包含許多方法和到許多類(lèi)信息的一種登錄入口。Type類(lèi)參考可以靠typeof或者GetType的方法得到。下表列舉了一些類(lèi)類(lèi)型的方法,包括示例GetTypeof 和typeof方法的代碼段。
Name
Description
GetFields()
Returns an array of FieldInfo objects describing the fields in the class.
GetMethods()
Returns an array of MethodInfo objects describing the methods of the class.
GetConstructors()
Returns all the constructors for an object.
GetInterfaces()
Gets all interfacs implemented by the type.
GetMembers()
Gets all the members (fields, methods, events, etc.) of the current type.
InvokeMember()
Invokes a member of the current type.
BaseType
Gets a Type object for the type's immediate base type.
IsAbstract
Returns true if the type is abstract.
IsClass
Returns true if the type is a class.
IsEnum
Returns true if the type is an enum.
IsNestedPublic
Returns true if a type is nested within another and is public.
Namespace
Retrieves the namespace of the type.
namespace CSharpReflectionSamples
{
using System;
using System.Reflection;
/// <summary>
/// Summary description for Client.
/// </summary>
public class Client
{
public static void Main()
{
// the typeof operator and the GetType method
// both return a 'Type' object.
Type type1 = typeof(Reflect);
Reflect objTest = new Reflect(0);
Type type2 = objTest.GetType();
Console.WriteLine("Type of objTest is {0}", type2);
}
}
}