zoukankan      html  css  js  c++  java
  • C#基础知识回顾-- 反射(1)


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

    未完待续……

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

  • 相关阅读:
    在IE和Firfox获取keycode
    using global variable in android extends application
    using Broadcast Receivers to listen outgoing call in android note
    help me!virtual keyboard issue
    using iscroll.js and iscroll jquery plugin in android webview to scroll div and ajax load data.
    javascript:jquery.history.js使用方法
    【CSS核心概念】弹性盒子布局
    【Canvas学习笔记】基础篇(二)
    【JS核心概念】数据类型以及判断方法
    【问题记录】ElementUI上传组件使用beforeupload钩子校验失败时的问题处理
  • 原文地址:https://www.cnblogs.com/smiler/p/3170796.html
Copyright © 2011-2022 走看看