看到他我一下子就悟了
来源:互联网 发布:专业剪辑软件 编辑:程序博客网 时间:2024/04/28 15:28
反射(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上BindingFlags 枚举
可以使用OR运算符把两个或者更多的标记连接在一起。实际上,括号中至少应包含Instance(或Static)
与Public(或NotPublic)标记,否则将不会获得任何方法。
GetMethods()方法的BindingFlages形式的一个主要用途在于,它可以只获得某个类自身定义的方法而不
获得它从基类继承的方法,这对于object尤其有用。
例如用下列形式来替换前面程序中的GetMethods()语句:
MethodInfo[] mi = t.GetMethods(BindingFlags.DeclaredOnly |BindingFlags.Instance |BindingFlags.Public);
进行上述更改后,程序的输出结果为:
可以看出,这里只显示了MyClass显示定义的方法。
未完待续……
<script type="text/javascript"><!--google_ad_client = "ca-pub-1944176156128447";/* cnblogs 首页横幅 */google_ad_slot = "5419468456";google_ad_width = 728;google_ad_height = 90;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
- 看到他我一下子就悟了
- 看到他我一下子就悟了
- 看到他我一下子就悟了(续)
- 被apple改了产品分类,我的软件一下子就没了销量。
- 看到第10句 我忽然就沉默了
- 费姨娘非常敏感,一下子就感觉出来了
- 电脑开机加速,一下子就提升了20几秒
- 我写了个程序给客户, 后来他告诉我根本没法用, 我问他怎么用, 他就:
- In-Place Merge Sort(这个描述实在太简单了,我一下子就明白了!不过这算MergeSort吗?算插入排序还差不多)
- “那个人样子好怪。”“我也看到了,他好像一条狗。”
- 指针数组和数组指针,看到这个我都头疼,今天要把他攻克了
- 让我看到了
- 一转眼他就过来了
- 经典语录--看到了就转了过来
- 没有功德的人就在眼前--我看到了“裸男”
- 我的json获取数据实例,直接运行就可以看到了
- 你看到我看到的了吗?
- 我就像是着了魔一样,在到处嗅着他的踪迹
- windows消息响应机制之一:消息分析器
- 串口调试助手,上位机数据,有时正常,有时出现周期性乱码(有时不正常)。
- thrift 搭建服务器框架
- 设计模式之观察者模式
- 2013年CIO最关心的10个业务和技术
- 看到他我一下子就悟了
- STM32F407之ADC简介
- Windows下安装MinGW后环境变量配置
- Windows 消息响应机制之二:消息 .
- CString转char * ,string
- Windows消息响应机制之三:线程与消息队列 .
- STM32F4之FPU性能的充分发挥-设置要点
- BSTR,CString,LPCTSTR三者之间的转化
- 程序学习-错误的学习方法及解决方法