这个版本的UseType力法与前面示例的不同之处在于:该版本显式地加载了包含该类型的程序集,而不是假定程序集依赖项会被自动解析。
前面的两个不例演示了如何获取一个基于类型名的Svstem.Type对象。你还可以获取内存中的任何对象或值的System.Type对象。为此,你可以调用System.Object.GetType方法。前面我们已经谈到System.Object是通用类型,并且所有的类型都与System.Object兼容,GetType就是system.Object的方法之一 。当GetType在一个值上被调用时,它只是简单地返回隐式属于该值的类型对象;当GetType方法在一个对象引用上被调用时,它将使用存储在对象头上的System.RuntimeTypeHandle,并且调月GetTypeFromHandle方法。
在对象或值上调用Getype方法,你可以发现对象或值的类型在运行时的情形。CetType方法是简单的应用是检查两个对象引用是否指向相同类型的实例。
public sealed class Util{
public static bool IsSameType(object o1,object o2)
Type tl =o1.GetType();//获取o1的类型
Type t2= p2.GetTyPe();//获取o2的类型
return tl== t2 //它们是相同的类型吗?
}
只有当o1和o2引用相同类型的实例时,该测试才会返回真。System.Type还能够通过IsSubclassOf方法和IsAssignableFrom方法支持类型兼容性测试。下面的代码测试了一个对象是否是另一个对象类型的子类的实例。
using System;
public sealed class Util {
Type t1=O1.GetType(); //获取 ol的类型
Type t2 =O2.GetType(); // 获取O2的类型
return t2.IsSubClassof(t1) || tl.IsSubclassOf(t2);
}
注意,在这个示例中,只有当其中一个对象是另一个对象的类型的直接或者间接基类型的实例时,测试才会返回真。也就是说如果tl和t2引用相同的类型,System.Type.IsSubClassOf方法将返回假。此外,如果ti和t2中有一个引用了接口类型时,System.Type.IsSubclassOf方法将返回假。当然,这存该示例中是不可能发生的,因为System.Object.GetType方法保证决不会返回接口类型的引用。
由于sytem.Type.IsSubclassOf方法用处不大,因此,该方法有个更有用些的变体System.Type IsAssignableFrom方法,它专门用于测试类型之间的兼容性。如果两个类型是相同的,其结果就为真。如果指定的类型派生于当前类型,那么结果为真;如果当前类型是一个接口,而指定的类型与当前类型兼容,那么结果也为真。考虑下面的示例:
图1
在这个示例中,IsCompatible方法的丁作方式类似于先前的IsRelatedType方法。区别在于:如果O1和O2引用相同类型的实例,现在的测试结果将会是真。我们还可能需要列举一个绐定类型的基类型或者接口(或者两者都有)。为了列举一个类型的接口,你可以调用System.Type.Get
interfaces方法,它返回一个Type对象的数组,每个被支持的接口对应一个Type对象。为了枚举一个类型的基类型,你可以递归地查看ystem.Type.BaseType属性。下面的代码将打印出与给定对象兼容的各个类型的列表
图2
这个例子使用AssemblyOualifiedName属性来获取类型的完全限定名。如果你想要一个更为友好的版本,那么可以使用FullName属性来获取命名空间的限定名,或者使用Name属性返回没有命名空间前缀的类型名称。这个例子还说明了CLR在基类型和接口处理上的差别。n