类型信息(Type Information)用来表示类型声明的信息,通过抽象基类System.Type的实例存储这些信息,当使用反射时,CLR获取指定类型的Type对象,通过这个对象即可访问该类型的任何信息,是反射的核心用法;有以下几种方式获取指定类型的Type对象:

Type myType = typeof(MyType);  //其中MyType是指定的类型

myType = myObj.GetType();  //其中myObj是指定类型的实例

myType = Type.GetType(myTypeName);  //其中myTypeName是指定类型的全名,与Type的实例属性FullName保持一致

myType = myAssembly.GetType(myTypeName);  //其中myAssembly是指定类型所在的程序集实例

  ※如果指定的类型不在全局命名空间中,myTypeName需要加入该类型所在的命名空间名称,例如:

    MyNameSpace.MyClass

  ※如果指定的类型是嵌套类型,那么需要用+来分割其与声明它的类型,例如:

    MyNameSpace.MyClass+MyNestedClass

  ※使用隐式转换、显式转换或as运算符将一个对象转换成其它类型的变量时,该变量获取到的类型信息不会变,依然是其原类型;

  ※只要获取的是同一种类型的类型信息,不管使用哪一种方式,它们的引用都是同一个:

int myNum1 = ;

int myNum2 = ;

//以下获取的所有类型实例都指向同一个对象,无论使用==还是Object.ReferenceEquals()都会返回true

Type type1 = myNum1.GetType();

Type type2 = myNum2.GetType();

Type type3 = typeof(int);

Type type4 = Type.GetType("System.Int32");

  ※对于泛型类型,只有其类型参数一致时,才会得到同样的类型实例;

  

  通过类型的Type对象,可以获取该类型的各种成员信息,包括:

 

  ※C#中的访问修饰符protected和internal在IL中没有任何意义,不会用于反射中;若要判断字段、方法、属性和事件中的get方法和set方法是否被声明为internal,使用字段信息类FieldInfo或方法信息基类MethodBase中的属性IsAssembly;若要判断是否被声明为protected,使用属性IsFamily;若要判断是否被声明为protectedinternal,使用属性IsFamilyOrAssembly;

  ※在各个获取成员信息的实例方法GetXXX()的参数列表中,有个BindingFlags类型的枚举组合用于指定搜索的范围组合,使用时必须要组合使用,例如:

  BindingFlags.Public | BindingFlags.Instance  //搜索范围为所有公共的实例成员

  BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance  //搜索范围为所有实例成员

  ※Type类的实例方法IsSubclassOf(Type c)用于确定当前类是否是从指定的类派生来的;

  ※通过基类MemberInfo中的实例方法IsDefined(Type attributeType, bool inherit)可以确定当前成员是否被指定了指定类型的特性;

  ※通过基类MemberInfo中的属性MemberType可以获取当前类型或成员的类型枚举组合,枚举类型的声明为:

public enum MemberTypes

{

    Constructor = ,  //构造函数
Event = , //事件
Field = , //字段
Method = , //方法
Property = , //属性
TypeInfo = , //类型
Custom = , //自定义成员类型
NestedType = , //嵌套类型
All = }

  类型信息中涉及到的东西较多,本篇内容会不定期进行完善。


如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的认可是我写作的最大动力!

作者:Minotauros
出处:https://www.cnblogs.com/minotauros/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

详解C#特性和反射(三)的更多相关文章

  1. EF+LINQ事物处理 C# 使用NLog记录日志入门操作 ASP.NET MVC多语言 仿微软网站效果(转) 详解C#特性和反射(一) c# API接受图片文件以Base64格式上传图片 .NET读取json数据并绑定到对象

    EF+LINQ事物处理   在使用EF的情况下,怎么进行事务的处理,来减少数据操作时的失误,比如重复插入数据等等这些问题,这都是经常会遇到的一些问题 但是如果是我有多个站点,然后存在同类型的角色去操作 ...

  2. 详解C#特性和反射(四)

    本篇内容是特性和反射的最后一篇内容,前面三篇文章: 详解C#特性和反射(一) 详解C#特性和反射(二) 详解C#特性和反射(三) 一.晚期绑定(Late Binding)是一种在编译时不知道类型及其成 ...

  3. 详解C#泛型(二) 获取C#中方法的执行时间及其代码注入 详解C#泛型(一) 详解C#委托和事件(二) 详解C#特性和反射(四) 记一次.net core调用SOAP接口遇到的问题 C# WebRequest.Create 锚点“#”字符问题 根据内容来产生一个二维码

    详解C#泛型(二)   一.自定义泛型方法(Generic Method),将类型参数用作参数列表或返回值的类型: void MyFunc<T>() //声明具有一个类型参数的泛型方法 { ...

  4. 详解C#特性和反射(一)

    使用特性(Attribute)可以将描述程序集的信息和描述程序集中任何类型和成员的信息添加到程序集的元数据和IL代码中,程序可以在运行时通过反射获取到这些信息: 一.通过直接或间接的继承自抽象类Sys ...

  5. 详解C#特性和反射(二)

    使用反射(Reflection)使得程序在运行过程中可以动态的获取对象或类型的类型信息,然后调用该类型的方法和构造函数,或访问和修改该类型的字段和属性:可以通过晚期绑定技术动态的创建类型的实例:可以获 ...

  6. php开发面试题---php面向对象详解(对象的主要三个特性)

    php开发面试题---php面向对象详解(对象的主要三个特性) 一.总结 一句话总结: 对象的行为:可以对 对象施加那些操作,开灯,关灯就是行为. 对象的形态:当施加那些方法是对象如何响应,颜色,尺寸 ...

  7. 【转】详解C#中的反射

    原帖链接点这里:详解C#中的反射   反射(Reflection) 2008年01月02日 星期三 11:21 两个现实中的例子: 1.B超:大家体检的时候大概都做过B超吧,B超可以透过肚皮探测到你内 ...

  8. [转载]详解网络传输中的三张表,MAC地址表、ARP缓存表以及路由表

    [转载]详解网络传输中的三张表,MAC地址表.ARP缓存表以及路由表 虽然学过了计算机网络,但是这部分还是有点乱.正好在网上看到了一篇文章,讲的很透彻,转载过来康康. 本文出自 "邓奇的Bl ...

  9. 详解Java8特性之新的日期时间 API

    详解Java8特性之新的日期时间 API http://blog.csdn.net/timheath/article/details/71326329 Java8中时间日期库的20个常用使用示例 ht ...

随机推荐

  1. 使用 vs.php 调试PHP相关问题

    1. 使用mysql_connect()方法时报错"Call to undefined function mysql_connect()" 这是由于在php.ini没有启用mysq ...

  2. linux-CentOS初学terminal命令(3)rm、chmod、mkdir、who、w、id、systemctl、

    PS 1:windows不允许出现字母相同,但是大小写不同的文件名,因为在windows下会将它们认作是同名. 但是linux允许出现字母相同,大小写不同的文件名. ps 2:prompt 提示 1. ...

  3. 【滚动条】Selenium+python自动化-JS处理滚动条

    转载地址: http://www.cnblogs.com/yoyoketang/p/6128655.html --------------------------------------------- ...

  4. 第73讲:Scala界面和事件处理编程进阶实战

    今天学习了王家林老师讲解的scala编程的第73讲,主要是文件选择器的使用.让我们通过代码来亲身体验一下. import scala.swing._import java.io.Fileimport ...

  5. js-设置时间,获取几天后的时间

    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8&qu ...

  6. [smarty] smarty 模板文件中进行字符串与变量的拼接

    // smarty 模板引擎 $arr_tribeLabelList["`$tribe_id`_"]

  7. 分形之谢尔宾斯基(Sierpinski)四面体

    前面讲了谢尔宾斯基三角形,这一节的将对二维三角形扩展到三维,变成四面体.即将一个正四面体不停地拆分,每个正四面体可以拆分成四个小号的正四面体.由二维转变到三维实现起来麻烦了许多.三维的谢尔宾斯基四面体 ...

  8. Python--随机生成指定长度的密码

    在浏览别人博客时学习了random模块,手痒自我练习下,写个随机生成指定长度的密码字符串的函数,拿出来供各位参考: 废话不多说,上代码: # coding: utf-8 import random i ...

  9. android 获取 imei号码

    Imei = ((TelephonyManager) getSystemService(TELEPHONY_SERVICE)) .getDeviceId(); 1.加入权限 在manifest.xml ...

  10. 【Win】Clso QR Tool 二维码小工具

    一个可以生成并识别二维码的windows小工具,纯绿色.不含糖. 可以通过输入文本生成二维码,或者加载本地图片.剪贴板内的图片,直接解析出二维码内容. 支持自定义LOGO. 下载文件 (当前版本:1. ...