.net框架读书笔记---反射(一)

本文详细解析了.NET框架中的反射机制,通过代码示例展示了如何在运行时加载程序集、查找类型及其成员,并提供了执行结果分析,强调了反射在动态编程中的重要作用。

接上一篇.net框架读书笔记---CLR寄宿、应用程序域 的铺垫,继续学习反射

反射概要

  元数据的本质是一大堆的表,当生成一个程序集或者模块时,编译器会创建一个类型定义表,一个字段定义表,一个方法定义表等等。System.Reflection命名空间包含着一些类型允许编写代码来反射这些元数据表。它为包含在一个程序集或者模块中的元数据提供了一个良好的对象模型。利用该模型中的类型,可以很容易的枚举出一个类型定义元数据表中包括的所有类型。

  上一节说过序列化使用了反射,当应用程序需要在运行时加载某个特定的程序集或者类型时,反射显得非常有用。例如,一个应用程序可能会要求用户提供一个程序集和类型的名称,然后就可以显示的加载程序集、构造类型实例,并调用类型上的方法(例如petshop三层架构里面的工厂模式),先绑定类型、然后调用方法的方式被称作为晚绑定(late binging)。而早绑定(early binding)指一个应用程序使用的类型和方法在编译时就已确定。

反射一个程序集中的类型

  编码开始

ContractedBlock.gif ExpandedBlockStart.gif 代码

   
namespace ReflectorStudy
{
class Program
{
static void Main( string [] args)
{
Assembly assme
= Assembly.GetExecutingAssembly();
Reflector.ReflectOnAssembly(assme);
}
}

public class Reflector
{
public static void ReflectOnAssembly(Assembly assem)
{
WriteLine(
0 , " Assembly :{0} " , assem);

// 查找模块
foreach (Module m in assem.GetModules())
{
WriteLine(
1 , " Module :{0} " , m);
// 查找类型
foreach (Type t in m.GetTypes())
{
WriteLine(
2 , " Type :{0} " , t);

// 查找成员
foreach (MemberInfo mi in t.GetMembers())
{
WriteLine(
3 , " {0} :{1} " , mi.MemberType,mi);
}
}

}
}

private static void WriteLine( int index, string format, params object [] args)
{
Console.WriteLine(
new string ( ' ' , 3 * index) + format,args);
}


}
class SomeType
{
public class InnerType { }

public int SomeField = 0 ;

private static string goo = null ;

private void SomeMethod() { }

private TimeSpan SomeProerty
{
get
{
return new TimeSpan();
}
set { }
}

public static event System.Threading.ThreadStart someEvent;

private void MoCompilerWarnings()
{
// 仅仅是为了消除编译器警告
someEvent.ToString();
goo.ToString();
}
}
}

 

执行截图:

2010052223432369.jpg

该程序集只包含了一个模块:ReflectorStudy.exe,总共定义了四种类型:Program,Reflector,SomeType和InnerType(内嵌)。

  仔细观察执行结果会发现,只有公有成员才被现实了出来,慢慢学习如何获取公有和私有成员吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值