接上一篇.net框架读书笔记---CLR寄宿、应用程序域 的铺垫,继续学习反射
反射概要
元数据的本质是一大堆的表,当生成一个程序集或者模块时,编译器会创建一个类型定义表,一个字段定义表,一个方法定义表等等。System.Reflection命名空间包含着一些类型允许编写代码来反射这些元数据表。它为包含在一个程序集或者模块中的元数据提供了一个良好的对象模型。利用该模型中的类型,可以很容易的枚举出一个类型定义元数据表中包括的所有类型。
上一节说过序列化使用了反射,当应用程序需要在运行时加载某个特定的程序集或者类型时,反射显得非常有用。例如,一个应用程序可能会要求用户提供一个程序集和类型的名称,然后就可以显示的加载程序集、构造类型实例,并调用类型上的方法(例如petshop三层架构里面的工厂模式),先绑定类型、然后调用方法的方式被称作为晚绑定(late binging)。而早绑定(early binding)指一个应用程序使用的类型和方法在编译时就已确定。
反射一个程序集中的类型
编码开始


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();
}
}
}
{
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();
}
}
}
执行截图:
该程序集只包含了一个模块:ReflectorStudy.exe,总共定义了四种类型:Program,Reflector,SomeType和InnerType(内嵌)。
仔细观察执行结果会发现,只有公有成员才被现实了出来,慢慢学习如何获取公有和私有成员吧。