.net的reflection (1)
發(fā)表時間:2024-06-17 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]在我的文章《C#基于接口的編程》中,我談?wù)摿耸褂贸橄蟮慕涌谧鳛榫幊谭独母鞣N優(yōu)點。分離接口和執(zhí)行過程,現(xiàn)在肯定不是新的思想,實際上它是com編程的核心。也許基于接口的在顯著的特征是多態(tài)性和即時檢查(RTTI).RTTI允許客戶端程序在運行時訪問對象。例如,如果一個對象執(zhí)行IAthlete接口,一個...
在我的文章《C#基于接口的編程》中,我談?wù)摿耸褂贸橄蟮慕涌谧鳛榫幊谭独母鞣N優(yōu)點。分離接口和執(zhí)行過程,現(xiàn)在肯定不是新的思想,實際上它是com編程的核心。也許基于接口的在顯著的特征是多態(tài)性和即時檢查(RTTI).RTTI允許客戶端程序在運行時訪問對象。例如,如果一個對象執(zhí)行IAthlete接口,一個客戶端程序能夠查找然后綁定這個接口用于調(diào)用和定位另一個接口。
查詢接口是強大的,是com+的基礎(chǔ)。同時,它對能夠在一個對象上執(zhí)行接口導(dǎo)向又是極端有用的和明確必要的,這是.net一個特別重要的概念。在介紹這個概念之前,讓我們再回顧一些信息關(guān)于在.net中功能性和分布的基礎(chǔ)元素--集合。
在COM(+),組件展開的邏輯和物理單元是一個.dll文件。在.net平臺中,展開的基礎(chǔ)單元是集合。與COM(+)組件不同的是一個.net或許是有多個文件組成,盡管它被看作是一個單一的何不可分割的功能和執(zhí)行單元。一個集合文件也是自描述的,它包含被稱之為中間語言的管制代碼和附加的元數(shù)據(jù),這個元數(shù)據(jù)給想綁定到這些代碼的客戶提供豐富的信息。.net的每個集合是著名的清單數(shù)據(jù)結(jié)構(gòu)。清單包含下列信息:
1、姓名和版本信息
2、其它集合的參考信息
3、安全邊界的信息。
4、集合中所有類型的信息
毫無疑問,集合清單類似于COM(+)的類型庫。清單有在類型庫中不存在的優(yōu)點。這個超過了這一課的范圍,我們將在這篇文章的第二部分進行講述。被利用.net集合的客戶端程序?qū)⒁褂们鍐。因為每個集合包含元數(shù)據(jù)的許多信息,客戶程序在運行時能夠得到集合的內(nèi)容。這個過程就叫做reflection.Reflection不僅能夠查詢基礎(chǔ)類,而且運行時能動態(tài)調(diào)用方法,甚至于輸出能夠直接執(zhí)行的IL代碼。在你的代碼中有兩種方法來使用reflection,Reflection API 和 System.Reflection 名字空間。System.reflection是極端負責(zé)的,它包含將近40個類。在文章的其他部分,我將介紹reflection的基礎(chǔ),如何用它區(qū)查詢集合類,方法,以及運行時調(diào)用方法的類型。為了示范在.net中的reflection名字空間,我將用下面的"reflection"類來說明:
// 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òu)造器,一個例子方法,一個例子存取方法(得到和設(shè)置)。在System.Reflaction 名字空間核心是一個名為type的類。這個type類型包含許多方法和到許多類信息的一種登錄入口。Type類參考可以靠typeof或者GetType的方法得到。下表列舉了一些類類型的方法,包括示例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);
}
}
}