如何获取一个类型引用

原著: Andrew Troelsen Pro C# 2008 and the .NET 3.5 Platform, Fourth Edition

System.Type类定义了一些成员,可以用来查看某个类型的元数据,其中很多成员都返回System.Reflection名字空间中的类型。例如,Type.GetMethods()返回一个MethodInfo数组,Type.GetFields()返回一个FieldInfo数组,等等。

获取Type引用的几种方法:

使用System.Object.GetType()获取一个类型引用

你可以使用多种方法获得一个Type类的实例。然而,你不能使用new关键字直接创建一个Type对象,因为Type是一个抽象类。首先,回想一下,System.Object定义了一个称为GetType()的方法,它返回一个表示当前对象元数据的Type类的实例。

//使用一个SportsCar实例获取类型信息

SportsCar sc = new SportsCar();

Type t = sc.GetType();

很明显,仅当你拥有类型的编译时知识(此处为SportsCar)以及当前在内存中存在一个此类型的实例时,这个方法才能工作。

使用System.Type.GetType()获取一个类型引用

为了灵活性,你可以调用System.Type类的静态成员GetType(),并指定类型的全限定名。使用这种方法,你不必拥有类型的编译时知识,因为Type.GetType()System.String对象作为参数。

//使用静态方法Type.GetType()获取类型信息,第二个参数指出如果找不到SportsCar类型不抛出异常,第三个参数指出忽略大小写。

Type t = Type.GetType(CarLibrary.SportsCar, false, true);

在这个例子中并没有提起包含类型的程序集。在这种情况下,假设类型定义在当前执行的程序集中。然而,如果你想获取一个外部私有程序集中某个类型的元数据,字符串参数格式为类型的权限定名,紧跟着包含类型的程序集的友好名(friendly name),以逗号分隔。

Type t = Type.GetType(CarLibrary.SportsCar, CarLibrary);

另外,传递给Type.GetType()的字符串也可以使用加号(+)表示嵌套类型。假设你想获取一个嵌套在JamesCar类中的SpyOptions枚举的类型信息,那么你可以这样编码:

Type t = Type.GetType(CarLibrary.JamesCar+SpyOptions);

使用typeof()获取一个类型引用

最后一种方法是使用C#typeof运算符:

Type t = typeof(SportCar);

Type.GetType()相比,使用这种方法你不必创建一个对象实例就可以获取它的类型信息。

但是,你必须拥有你所感兴趣的类型的编译时知识,因为typeof希望参数是类型的强类型名而不只是类型的文本表示。

疑惑?

  前几天就在邮件通知中看到几条评论,但是直到今天才在博客中看到这几条评论出现。但是却出现一个问题,无法回复或者评论,不知道什么原因?联想到前些日子在博客中上传图片总是出错,不仅怀疑起csdn的问题。

  还是在这里简单的回答一下那位网友的问题吧。由于我对SOA不甚了解,在这里也只能说说自己的看法。类似于SOA,Remoting或者WCF之类的技术都是基于代理模式的,也就是说不管在服务器端还是在客户端,你都是和代理对象交互,你并不能得到代理背后的对象,当然也就不能对其进行反射。

  但是你所说的情况为它是一个方法的参数,此时服务器端必须拥有定义此类型程序集的引用,否则不能编译通过,所以说连编译都不能通过更别提反射了。

  另外,反射的前提是必须拥有某个类型的元数据信息,一般都保存在定义类型的程序集中。.NET好像可以通过编程动态创建类型,不过我并没有研究过,因此不敢妄下结论。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值