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

    反射技术在多数.NET程序中不会被使用,但是它的确是非常重要的技术,在很多应用程序中有着不可替代的作用。.Net的应用程序体系分为以下4个层次:程序集(Assembly)、模块(Module)、类型(Class)和类型成员(Member),反射技术可以在程序运行时获取这4个层次的元数据信息。只要掌握了反射技术实现的基本原理,就可以轻松解决各种形式的反射技术问题。

    说明:应用程序域是程序集层次之上的更大的容器,一个应用程序域可以装载多个程序集,本章暂不讨论。

      面试例题6:如何使用反射技术获取指定类型中方法的完整信息?

      考点:反射技术的基本知识以及获取Type对象的方式,了解System.Reflection命名空间下的类型。

      出现频率:★★★

    解答
      使用反射技术可以轻松获取指定类型方法的完整信息,首先获取指定类型的Type对象,然后通过Type对象的成员获取类型中方法的元数据信息。本题定义了ClassA类,定义了2个方法,并重写了ToString()方法,由于该类隐式继承于System.Object类,所以该类还含有继承于基类的多个方法。在主程序通过反射获取方法信息时,无法被Type对象获取,这是因为MethodA()方法不是公共成员,在目录下新建一个程序文件,并命名为MethodRef.cs,编写代码如代码7.6所示。

    代码7.6 反射获取方法信息:MethodRef.cs

    +展开
    -C#
    using System;
    //导入相应的命名空间
    using System.Reflection;

    class MethodRef
    {
    static void Main(string[] args)
    {
    //调用Type类的静态方法GetType,并将Type对象引用返回给tp变量
    Type tp = Type.GetType("ClassA"falsefalse);
    //tp对象调用GetMethods方法,返回对象中所有公共方法数组,并赋值给ma数组
    MethodInfo[] ma = tp.GetMethods();
    Console.WriteLine("/n/t=================ClassA类所含的方法=================");
    //遍历ma数组中的所有MethodInfo类型子项
    foreach (MethodInfo s in ma)
    {
    //依次输出MethodInfo类型子项的属性值
    Console.WriteLine("/n/t【{0}方法】", s.Name);
    Console.Write("方法所属类名称:【{0}】", s.DeclaringType);
    Console.WriteLine("/t方法是否为构造函数:【{0}】", s.IsConstructor);
    Console.Write("方法是否为public成员:【{0}】", s.IsPublic);
    Console.WriteLine("/t方法是否为internal成员:【{0}】", s.IsAssembly);
    Console.Write("方法是否为protected成员:【{0}】", s.IsFamily);
    Console.WriteLine("/t方法是否为private成员:【{0}】", s.IsPrivate);
    Console.Write("方法是否为泛型方法:【{0}】", s.IsGenericMethod);
    Console.WriteLine("/t方法是否为静态方法:【{0}】", s.IsStatic);
    Console.Write("方法是否为virtual方法:【{0}】", s.IsVirtual);
    Console.WriteLine("/t方法返回类型为:【{0}】", s.ReturnType);
    //调用s的GetParameters方法,返回ParameterInfo类型数组
    //遍历数组的ParameterInfo类型子项
    foreach (ParameterInfo pms in s.GetParameters())
    {
    //输出ParameterInfo类型子项的属性
    Console.WriteLine("/n/t------【{0}参数】------", pms.Name);
    Console.Write("参数类型:【{0}】", pms.ParameterType);
    Console.WriteLine("/t参数位置:【{0}】", pms.Position);
    }
    }        
    }
    }
    class ClassA
    {
    string _name;
    //定义internal权限的MethodA方法
    internal string MethodA(string s)
    {
    _name = s;
    return _name;
    }
    //定义public权限的MethodB方法
    public void MethodB(int i,string j)
    {
    Console.WriteLine("MethodA方法已调用,所传递参数为{0}和{1}",i,j);
    }
    //重写ToString方法
    public override string ToString()
    {
    return "ClassA类的对象";
    }
    }



      在命令行下编译MethodRef.cs,执行MethodRef程序,运行结果如图7.8所示。

      本程序通过System.Type类的GetType()方法获取ClassA类的Type对象tp,接着进行2层foreach语句嵌套,遍历方法的详细信息。当tp对象通过GetMethods()方法返回ma数组后,通过外层foreach语句遍历并输出该数组的MethodInfo类型子项属性,即每个方法的属性。在内层foreach语句结构中, ma数组子项调用GetParameters()方法返回的数组进行再次遍历,即可输出每个方法的参数详细信息(每个参数对应一个 ParameterInfo类型对象)。

  • 相关阅读:
    原型模式 prototype
    OOAD之单例模式Singleton的6种写法
    OOAD之创建型模式之工厂模式
    OOAD之面向对象设计原则
    第一章 面向对象软件工程与UML
    Oracle数据库之PL/SQL触发器
    Oracle数据库之开发PL/SQL子程序和包
    Oracle数据库中的分页--rownum
    Oracle数据库之FORALL与BULK COLLECT语句
    Oracle数据库 中的基础的一些语法结构
  • 原文地址:https://www.cnblogs.com/cpcpc/p/2123073.html
Copyright © 2011-2022 走看看