zoukankan      html  css  js  c++  java
  • C#反射教程(3)

    在命令行下编译ClassRef.cs,执行ClassRef程序,程序提示"请输入所检测的类型名称:",输入"ClassA",运行结果如图7.9所示。

      主程序首先进入一个不限次数的while循环,循环中首先判断输入值是否为"quit"。如果输入为"quit"则跳出循环,否则将输入值当做类型名称字符串传递给Type类的GetType()方法,获取Type对象的引用tp,并再次传递给ClassB的Ref()方法。执行完Ref()方法后,程序将继续循环,提示"请输入所检测的类型名称:"直到用户输入"quit"为止。如图7.9所示,输入"ClassA"后,程序直接输出了 ClassA类的细节信息。再次输入"ClassB",程序输出ClassB类的细节信息,运行结果如图7.10所示。

    图7.9 反射ClassA类型的信息

    图7.10 反射ClassB类型的信息

      在信息输出的最后一行,程序正确判断出ClassB类不实现任何接口类型,而在图7.9中,则输出了ClassA类所支持的接口类型列表。这些功能的完成代码如下所示:

    +展开
    -C#
    Type[] Itp = tp.GetInterfaces();
    if (Itp.Length != 0)
    {
    foreach (Type t in Itp)
    {
    Console.WriteLine("{0}实现的接口类型->{1}", FullName, t.FullName);
    }
    }
    else
    {
    Console.WriteLine("{0}不实现的任何接口类型", FullName);
    }


      以上代码,调用tp对象的GetInterfaces()方法,可返回该类型所实现的接口数组。有一点需要注意,所返回的接口类型是Type类型的对象。继续输入"IClassA",运行结果如图7.11所示。

    图7.11 反射IClassA类型的信息

      IClassA是自定义的接口类型,继承于IClass接口,而不是实现IClass接口,这里需要注意:.NET所提供的基类库也可以用于反射。最后输入"System.Byte",运行结果如图7.12所示。

    图7.12 反射System.Byte类型的信息

      程序输出了基类库中System.Byte类的详细信息。

    解析
      类似于获取指定类型的方法细节信息,同样的方法可以获取指定类型自身细节信息。当获取MyClass类型的某些特征时,方法如以下代码所示:

    -C#

    using System;

    Type tp = System.Type.GetType("MyClass"falsefalse);
    string FullName = tp.FullName;
    Console.WriteLine("这个类型的全饰名称是{0}", FullName);
    Console.WriteLine("{0}是接口类型吗?->{1}", FullName, tp.IsInterface);


      以上代码中,通过读取指定类型的Type对象属性,可获得类型的特征。除了属性,还可以调用其方法返回集合,获取MyClass类型所有成员的方法,如以下代码所示:

    -C#
    using System;
    using System.Reflection;

    Type tp = System.Type.GetType("MyClass"falsefalse);
    MemberInfo[] mi = tp.GetMembers();


      以上代码中,调用tp对象的GetMembers()方法返回一个数组,数组子项的类型为MemberInfo,即所有成员的信息。

    注意:MemberInfo类是在System.Reflection命名空间下。

  • 相关阅读:
    nyoj 16 矩形嵌套
    nyoj 44 子串和
    nyoj 448 寻找最大数
    nyoj 14 会场安排问题
    hdoj 1008 Elevator
    bzoj1588
    bzoj3224
    bzoj1503
    bzoj1834
    bzoj1066
  • 原文地址:https://www.cnblogs.com/cpcpc/p/2123071.html
Copyright © 2011-2022 走看看