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:由于工作原因,本打算今天的更新可能要推迟到周六实在抱歉……

  • 相关阅读:
    【SAS NOTE】OUTPUT
    【SAS NOTES】_NULL_
    【SAS NOTE】sas 9.2 安装
    【SAS NOTE】FREQ
    纯数学教程 Page 203 例XLI (1)
    纯数学教程 Page 203 例XLI (3)
    纯数学教程 Page 203 例XLI (2)
    Prove Cauchy's inequality by induction
    纯数学教程 Page 325 例LXVIII (15) 调和级数发散
    纯数学教程 Page 325 例LXVIII (15) 调和级数发散
  • 原文地址:https://www.cnblogs.com/smiler/p/3170796.html
Copyright © 2011-2022 走看看