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类所支持的接口类型列表。这些功能的完成代码如下所示:
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#
Type tp = System.Type.GetType("MyClass", false, false);
string FullName = tp.FullName;
Console.WriteLine("这个类型的全饰名称是{0}", FullName);
Console.WriteLine("{0}是接口类型吗?->{1}", FullName, tp.IsInterface);
以上代码中,通过读取指定类型的Type对象属性,可获得类型的特征。除了属性,还可以调用其方法返回集合,获取MyClass类型所有成员的方法,如以下代码所示:
using System.Reflection;
Type tp = System.Type.GetType("MyClass", false, false);
MemberInfo[] mi = tp.GetMembers();
以上代码中,调用tp对象的GetMembers()方法返回一个数组,数组子项的类型为MemberInfo,即所有成员的信息。
注意:MemberInfo类是在System.Reflection命名空间下。