毫无疑问,集合清单类似于COM(+)的类型库。清单有在类型库中不存在的优点。这个超过了这一课的范围,我们将在这篇文章的第二部分进行讲述。被利用.net集合的客户端程序将要使用清单。因为每个集合包含元数据的许多信息,客户程序在运行时能够得到集合的内容。这个过程就叫做reflection.Reflection不仅能够查询基础类,而且运行时能动态调用方法,甚至于输出能够直接执行的IL代码。在你的代码中有两种方法来使用reflection,Reflection API 和 System.Reflection 名字空间。System.reflection是极端负责的,它包含将近40个类。在文章的其他部分,我将介绍reflection的基础,如何用它区查询集合类,方法,以及运行时调用方法的类型。为了示范在.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;
// 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; } } } }
正如你所看到的那样,这个类包含一个构造器,一个例子方法,一个例子存取方法(得到和设置)。在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);