反射器组件
由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层了呢?