博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#基础知识回顾-- 反射(1)
阅读量:7270 次
发布时间:2019-06-29

本文共 2130 字,大约阅读时间需要 7 分钟。

   反射(reflection)是一种允许用户获得类型信息的C#特性。术语“反射”源自于它的工作方式:

Type对象映射它所代表的底层对象。对Type对象进行查询可以获得(反射)与类型相关的信息。反射是一种

功能强大的机制,它允许学习和使用只在运行时才能知道的类型功能

  这些是官方定义,其实说白了,反射就是能知道我们未知类型的类型信息这么一个东西.没什么神秘可讲!

反射的核心是System.Type。System.Type包含了很多属性和方法,使用这些属性和方法可以在运行时得到类型信息。

一旦得到类型信息,就可以调用其构造函数、方法和属性。因此,反射允许使用编译时不可用的代

码。因为反射涉及内容太多,我们主要学习常用的反射技术。

一、获取方法的相关信息

  一旦有了Type对象,就可以使用GetMethods()方法来获取此类型支持的方法的列表。它的一种形式为:

  MethodInfo[] GetMethods()

  MethodInfo对象描述了主调类型所支持的方法,因此可以通过它的Name属性获得方法的名称。同时它还有两个重

要的方法,ReturnType和GetParameters()。

  只读属性ReturnType为一个Type类型的对象,它为用户提供方法的返回类型信息。

  GetParameters()返回一个方法的参数列表,它的基本形式为:

  ParameterInfo[] GetParameters()

  参数信息保存在ParameterInfo对象中。ParameterInfo类定义了大量描述参数信息的属性和方法。

其中常用属性是Name和ParameterType,这两个属性我就不介绍了,从字面上应该可以理解了。

好了,不说了,讲了这么多概念想必大家都不耐烦了。下面我们先看代码示例,估计你看了以后,再结合上面的

概念讲解,你一定会说:哦,原来如此!!!

  

class MyClass    {        int x;        int y;        public MyClass(int i, int j)        {            x = i;            y = j;        }        public int Sum()        {            return x + y;        }        public bool IsBetween(int i)        {            if (x < i && i < y)                return true;            else                return false;        }        public void Set(int a, int b)        {            x = a;            y = b;        }        public void Set(double a, double b)        {            x = (int)a;            y = (int)b;        }        public void Show()        {            Console.WriteLine("x:{0},y:{1}", x, y);        }    }

运行结果:

  请注意,除了MyClass定义的方法外,object定义的方法也会被显示。这是因为C#所有的类都继承于object。

另外,类型名称(如Int32)采用的是.net结构的名称。

二、GetMethods()的另外一种形式

  这种形式中可以指定各种标记,以此筛选出想要获取的方法,它的基本形式:

  MethodInfo[] GetMethods(BindingFlags flags)

这种形式只获得与所指定的条件相匹配的方法,BindingFlages 是一个枚举,相关知识请参考:

msdn上

  可以使用OR运算符把两个或者更多的标记连接在一起。实际上,括号中至少应包含Instance(或Static)

与Public(或NotPublic)标记,否则将不会获得任何方法。

  GetMethods()方法的BindingFlages形式的一个主要用途在于,它可以只获得某个类自身定义的方法而不

获得它从基类继承的方法,这对于object尤其有用。

例如用下列形式来替换前面程序中的GetMethods()语句:

MethodInfo[] mi = t.GetMethods(BindingFlags.DeclaredOnly |BindingFlags.Instance |BindingFlags.Public);

进行上述更改后,程序的输出结果为:

可以看出,这里只显示了MyClass显示定义的方法。

未完待续……

PS:由于工作原因,本打算今天的更新可能要推迟到周六实在抱歉……

 

转载地址:http://diycm.baihongyu.com/

你可能感兴趣的文章
Redis监控工具,命令和调优
查看>>
hdu1035 Robot Motion (DFS)
查看>>
MapReduce编程实战之“高级特性”
查看>>
Html中的表格
查看>>
树莓派进阶之路 (017) - 树莓派的专用摄像头实现局域网监控
查看>>
使用yum高速部署Oracle安装环境(11g)
查看>>
推断数组中的反复元素
查看>>
sqlplus中怎么将你全部的操作和结果记录保存到你指定的文件里
查看>>
【Unity笔记】摄像机、图片的模糊处理
查看>>
Xcode 中的小技巧
查看>>
支付宝接口
查看>>
为什么要有指针?
查看>>
zabbix客户端一键安装脚本
查看>>
base64 数据编码原理
查看>>
iOS -- 网络/本地 图片 按自定义比例缩放 不失真 方法
查看>>
关于tensorflow conv2d卷积备忘的一点理解
查看>>
用研关键三步骤:问题、方法与分析
查看>>
struts中json机制与普通页面跳转机制混用(全局结果集配置返回json)
查看>>
MySQL加密解密
查看>>
ASP.NET Core 使用Redis存储Session
查看>>