欢迎来到.net学习网

欢迎联系站长一起更新本网站!QQ:879621940

您当前所在位置:首页 »  .NET本质论第一卷:公共语言运行库教程 » 正文

本教程章节列表

用类型编程-运行时的类型(3)

创建时间:2012年09月13日 15:30  阅读次数:(3433)
分享到:
这个版本的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.Getinterfaces方法,它返回一个Type对象的数组,每个被支持的接口对应一个Type对象。为了枚举一个类型的基类型,你可以递归地查看ystem.Type.BaseType属性。下面的代码将打印出与给定对象兼容的各个类型的列表

图2

这个例子使用AssemblyOualifiedName属性来获取类型的完全限定名。如果你想要一个更为友好的版本,那么可以使用FullName属性来获取命名空间的限定名,或者使用Name属性返回没有命名空间前缀的类型名称。这个例子还说明了CLR在基类型和接口处理上的差别。n
来源:.net学习网
说明:所有来源为 .net学习网的文章均为原创,如有转载,请在转载处标注本页地址,谢谢!
【编辑:Wyf】

打赏

取消

感谢您的支持,我会做的更好!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

最新评论

共有评论0条
  • 暂无任何评论,请留下您对本文章的看法,共同参入讨论!
发表评论:
留言人:
内  容:
请输入问题 57+32=? 的结果(结果是:89)
结  果: