通过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层了呢?