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类型对象)。

posted @ 2011-01-27 10:09  cpcpc  阅读(868)  评论(0编辑  收藏  举报