zoukankan      html  css  js  c++  java
  • 看到他我一下子就悟了-- 反射

    看到他我一下子就悟了-- 反射(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显示定义的方法。

    未完待续……

     
     
    分类: C#
    标签: C#.net反射反射方法
  • 相关阅读:
    UVA.12096 The SetStack Computer ( 好题 栈 STL混合应用)
    HDOJ(HDU).1412 {A} + {B} (STL SET)
    UVA.10474 Where is the Marble ( 排序 二分查找 )
    HDOJ(HDU).1754 I Hate It (ST 单点替换 区间最大值)
    HDOJ(HDU).1166 敌兵布阵 (ST 单点更新 区间求和)
    17 西安
    17 沈阳
    13 南京
    10/11 作战会议
    2019牛客国庆集训派对day5
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3170937.html
Copyright © 2011-2022 走看看