通过Type,我们可以对任何类型进行反射读取,同样,也可以把读取的对象的范围扩大。
一,关于程序集
在.net中,程序集是进行部署,版本控制的基本单元;
System.reflection命名空间下的Assembly类型,代表了一个程序集,并包含了关于程序集的信息。
获取assembly对象的方法:
loadForm 参数:程序集的文件名称(如果加载一个不属于当前项目的程序集,则要写上全名)
Load 参数:提供程序集名称即可,而非文件名称。
二,反射程序集示例
首先,我们建立如下结构解决方案:
然后在Test类库中的class1里面添加如下测试内容:
namespace Test
{
public abstract class BaseClass { }
public struct DemoStruct { }
public delegate void DemoDelegate(Object sender,EventArgs e);
public enum DemoEnum { terrible,bad,common=4,good,wonderful=8}
public interface IDemoInterface {
void SayGreeting(string name);
}
public interface IdemoInterface2 { }
public sealed class DemoClass : BaseClass, IDemoInterface, IdemoInterface2 {
private string name;
private string city;
public readonly string title;
public const string text = "const field";
public event DemoDelegate myEvent;
public string Name {
private get { return name; }
set { name = value; }
}
public DemoClass() {
title = "Readonly field";
}
public class NestedClass { }
public void SayGreeting(string name)
{
Console.WriteLine("morning:"+name);
}
}
}
接着,我们就使用Assembly来获取程序集:
namespace 反射程序集
{
class Program
{
static void Main(string[] args)
{
AssemblyExplore();
}
//查看Test程序集中的全部类型
public static void AssemblyExplore() {
StringBuilder sb = new StringBuilder();
Assembly asm = Assembly.Load("Test"); //加载Test
sb.AppendLine("全名:"+asm.FullName); //输出全名
sb.AppendLine("路径:"+asm.Location);//输出路径
Module[] modules = asm.GetModules(); //获取程序集中所有模块
foreach (Module model in modules ) //遍历模块数组
{
sb.AppendLine("模块:"+model);
Type[] types = model.GetTypes(); //得到模块里面的各种类,接口啥的。。。
foreach (Type t in types)
{
sb.AppendLine(" 类型:"+t); //看看啥类型滴。。。。
}
}
Console.WriteLine(sb.ToString());
}
}
}
查看我们运行结果:
真的好神奇呀~~~等等,是不是想起以前设计模式中读取配置文件,然后反射加载D层了呢?