当前位置:  编程技术>.net/c#/asp.net

关于C#基础知识回顾--反射(一)

    来源: 互联网  发布时间:2014-10-22

    本文导语:  反射(reflection)是一种允许用户获得类型信息的C#特性。术语“反射”源自于它的工作方式:Type对象映射它所代表的底层对象。对Type对象进行查询可以获得(反射)与类型相关的信息。反射是一种功能强大的机制,它允许学...

反射(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显示定义的方法。

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Python异常处理基础知识
  • 看Linux源代码需要什么样的基础知识?
  • HTML 基础知识教程及代码实例
  • 请问哪里有 《JAVA核心技术--基础知识》的电子书下载,谢谢!
  • 计算机底层开发需要哪些基础知识
  • 请问要想开发嵌入式Linux系统的驱动程序需要哪些基础知识??
  • 请教RMI基础知识,谢谢!
  • Oracle相关基础知识教程集锦
  • 想快速了解一下Linux基础知识。请前辈们指点迷津!
  • 请问谁有《java2核心技术 卷I:基础知识》书中例子的源代码?急需!!!
  • 关于《java2核心技术卷I:基础知识》 这本书中例子在jcreator2.5运行的问题.
  • 谁能给我《Java 2 核心技术 卷I:基础知识》的源代码,本人的随书光盘丢了,谢谢了!急
  • 完全看懂unix环境高级编程(w.richard.stevens)需要哪些基础知识?
  • 高分求教基础知识:大家谁知道哪个学习哪个版本UNIX好,在微机上怎么安装?可以下载安装程序吗?
  • 请教:在FEDORA CORE 7下做B/S模式的WEB应用开发都需要掌握哪些与LINUX有关的基础知识?
  • SQL学习笔记一SQL基础知识
  • 基础知识:Oracle数据库的启动方式
  • 上哪去找corejava?java2核心技术(卷Ⅰ:基础知识)配套光盘的corejava可以吗?若可以该如何设置?
  • JSP如何着手(一点基础知识都没有)?
  • 学习Java是从基础知识开始学习好还是直接学习JBuilder好?
  • signal()基础知识,<<apue>>上的程序疑问


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3