C#反射教程(3)

在命令行下编译ClassRef.cs,执行ClassRef程序,程序提示"请输入所检测的类型名称:",输入"ClassA",运行结果如图7.9所示。

  主程序首先进入一个不限次数的while循环,循环中首先判断输入值是否为"quit"。如果输入为"quit"则跳出循环,否则将输入值当做类型名称字符串传递给Type类的GetType()方法,获取Type对象的引用tp,并再次传递给ClassB的Ref()方法。执行完Ref()方法后,程序将继续循环,提示"请输入所检测的类型名称:"直到用户输入"quit"为止。如图7.9所示,输入"ClassA"后,程序直接输出了 ClassA类的细节信息。再次输入"ClassB",程序输出ClassB类的细节信息,运行结果如图7.10所示。

图7.9 反射ClassA类型的信息

图7.10 反射ClassB类型的信息

  在信息输出的最后一行,程序正确判断出ClassB类不实现任何接口类型,而在图7.9中,则输出了ClassA类所支持的接口类型列表。这些功能的完成代码如下所示:

+展开
-C#
Type[] Itp = tp.GetInterfaces();
if (Itp.Length != 0)
{
foreach (Type t in Itp)
{
Console.WriteLine("{0}实现的接口类型->{1}", FullName, t.FullName);
}
}
else
{
Console.WriteLine("{0}不实现的任何接口类型", FullName);
}


  以上代码,调用tp对象的GetInterfaces()方法,可返回该类型所实现的接口数组。有一点需要注意,所返回的接口类型是Type类型的对象。继续输入"IClassA",运行结果如图7.11所示。

图7.11 反射IClassA类型的信息

  IClassA是自定义的接口类型,继承于IClass接口,而不是实现IClass接口,这里需要注意:.NET所提供的基类库也可以用于反射。最后输入"System.Byte",运行结果如图7.12所示。

图7.12 反射System.Byte类型的信息

  程序输出了基类库中System.Byte类的详细信息。

解析
  类似于获取指定类型的方法细节信息,同样的方法可以获取指定类型自身细节信息。当获取MyClass类型的某些特征时,方法如以下代码所示:

-C#

using System;

Type tp = System.Type.GetType("MyClass"falsefalse);
string FullName = tp.FullName;
Console.WriteLine("这个类型的全饰名称是{0}", FullName);
Console.WriteLine("{0}是接口类型吗?->{1}", FullName, tp.IsInterface);


  以上代码中,通过读取指定类型的Type对象属性,可获得类型的特征。除了属性,还可以调用其方法返回集合,获取MyClass类型所有成员的方法,如以下代码所示:

-C#
using System;
using System.Reflection;

Type tp = System.Type.GetType("MyClass"falsefalse);
MemberInfo[] mi = tp.GetMembers();


  以上代码中,调用tp对象的GetMembers()方法返回一个数组,数组子项的类型为MemberInfo,即所有成员的信息。

注意:MemberInfo类是在System.Reflection命名空间下。

posted @ 2011-01-27 10:12  cpcpc  阅读(1111)  评论(0编辑  收藏  举报