标签:
一.在.NET中,程序集是进行部署,版本控制的基本单元。System.Reflection命名空间中的Assembly类型,代表了一个程序集。并包含了关于程序集的信息。
二.获取程序集的信息:
创建一个控制台项目,添加一个类库项目,命名为Model,里面有一个User类。
static void Main(string[] args) { //1.使用LoadFrom,前提当前项目有该程序集的引用 Assembly asm = Assembly.LoadFrom("Model.dll"); //2.使用Load,前提当前项目有该程序集的引用 Assembly asm1 = Assembly.Load("Model"); //3.加载不属于当前项目的的程序集,需要给出全路径 Assembly asm2 = Assembly.LoadFrom(AppDomain.CurrentDomain.BaseDirectory + "\\Model.dll"); //4.在活动Type类型实例之后,可以使用该Type实例的Assembly属性来获得所在程序集 User u = new User(); Type t = u.GetType(); Assembly asm3 = t.Assembly; }
F5断点调试,发现ExportTypes属性下面有一个System.Type对象 为User类。
修改Model中的类:
public class Department { public string dname { get; set; } public Department() { dname = "开发部"; } public void GetShow() { Console.WriteLine("我是department中的GetShow方法"); } }
public class User { public string name { get; set; } public User() { name = "小米"; } public void GetShow() { Console.WriteLine("我是User中的GetShow方法"); } }
static void Main(string[] args) { //1.使用LoadFrom,前提当前项目有该程序集的引用 Assembly asm = Assembly.LoadFrom("Model.dll"); //2.使用Load,前提当前项目有该程序集的引用 Assembly asm1 = Assembly.Load("Model"); //3.加载不属于当前项目的的程序集,需要给出全路径 Assembly asm2 = Assembly.LoadFrom(AppDomain.CurrentDomain.BaseDirectory + "\\Model.dll"); //4.在活动Type类型实例之后,可以使用该Type实例的Assembly属性来获得所在程序集 User u = new User(); Type t = u.GetType(); Assembly asm3 = t.Assembly; Console.WriteLine("FullName(全名):"+asm3.FullName); Console.WriteLine("Location(路径):"+asm3.Location); Module[] modules = asm3.GetModules(); foreach (Module model in modules) { Console.WriteLine("模块:"+model); Type[] types = model.GetTypes(); foreach (Type type in types) { Console.WriteLine("类型:" + type); } } }获取程序集中的模块信息。
三.成员信息和MemverInfo类型:
修改上面的代码:
static void Main(string[] args) { //1.使用LoadFrom,前提当前项目有该程序集的引用 Assembly asm = Assembly.LoadFrom("Model.dll"); //2.使用Load,前提当前项目有该程序集的引用 Assembly asm1 = Assembly.Load("Model"); //3.加载不属于当前项目的的程序集,需要给出全路径 Assembly asm2 = Assembly.LoadFrom(AppDomain.CurrentDomain.BaseDirectory + "\\Model.dll"); //4.在活动Type类型实例之后,可以使用该Type实例的Assembly属性来获得所在程序集 User u = new User(); Type t = u.GetType(); Assembly asm3 = t.Assembly; Console.WriteLine("FullName(全名):"+asm3.FullName); Console.WriteLine("Location(路径):"+asm3.Location); Module[] modules = asm3.GetModules(); foreach (Module model in modules) { Console.WriteLine("模块:"+model); Type[] types = model.GetTypes(); foreach (Type type in types) { Console.WriteLine("类型:" + type); MemberInfo[] menberInfo = type.GetMembers(); foreach (MemberInfo mi in menberInfo) { Console.WriteLine("成员:"+mi.ToString()+"类型:"+mi.MemberType); } Console.WriteLine(); } } }
四.字段信息和FieldInfo类型:
在Department中增加 public int level;等级字段;在User中增加public int age;年龄字段;修该上面代码:
static void Main(string[] args) { //1.使用LoadFrom,前提当前项目有该程序集的引用 Assembly asm = Assembly.LoadFrom("Model.dll"); //2.使用Load,前提当前项目有该程序集的引用 Assembly asm1 = Assembly.Load("Model"); //3.加载不属于当前项目的的程序集,需要给出全路径 Assembly asm2 = Assembly.LoadFrom(AppDomain.CurrentDomain.BaseDirectory + "\\Model.dll"); //4.在活动Type类型实例之后,可以使用该Type实例的Assembly属性来获得所在程序集 User u = new User(); Type t = u.GetType(); Assembly asm3 = t.Assembly; Console.WriteLine("FullName(全名):"+asm3.FullName); Console.WriteLine("Location(路径):"+asm3.Location); Module[] modules = asm3.GetModules(); foreach (Module model in modules) { Console.WriteLine("模块:"+model); Type[] types = model.GetTypes(); foreach (Type type in types) { Console.WriteLine("类型:" + type); //MemberInfo[] menberInfo = type.GetMembers(); //foreach (MemberInfo mi in menberInfo) //{ // Console.WriteLine("成员:"+mi.ToString()+"类型:"+mi.MemberType); //} //Console.WriteLine(); FieldInfo[] fields = type.GetFields(); foreach (FieldInfo fi in fields) { Console.WriteLine("名称:"+fi.Name+"类型:"+fi.FieldType+"特性:"+fi.Attributes); } Console.WriteLine(); } } }
五:属性信息和PropertyInfo类型:
修改上面的代码:
//FieldInfo[] fields = type.GetFields(); //foreach (FieldInfo fi in fields) //{ // Console.WriteLine("名称:"+fi.Name+"类型:"+fi.FieldType+"特性:"+fi.Attributes); //} //Console.WriteLine(); PropertyInfo[] pis = type.GetProperties(); foreach (PropertyInfo pi in pis) { Console.WriteLine("名称:" + pi.Name + "类型:" + pi.PropertyType + "特性:" + pi.Attributes+"可读:"+pi.CanRead+"可写"+pi.CanWrite); }
修改面代码:
static void Main(string[] args) { //1.使用LoadFrom,前提当前项目有该程序集的引用 Assembly asm = Assembly.LoadFrom("Model.dll"); //2.使用Load,前提当前项目有该程序集的引用 Assembly asm1 = Assembly.Load("Model"); //3.加载不属于当前项目的的程序集,需要给出全路径 Assembly asm2 = Assembly.LoadFrom(AppDomain.CurrentDomain.BaseDirectory + "\\Model.dll"); //4.在活动Type类型实例之后,可以使用该Type实例的Assembly属性来获得所在程序集 User u = new User(); Type t = u.GetType(); Assembly asm3 = t.Assembly; Console.WriteLine("FullName(全名):"+asm3.FullName); Console.WriteLine("Location(路径):"+asm3.Location); Module[] modules = asm3.GetModules(); foreach (Module model in modules) { Console.WriteLine("模块:"+model); Type[] types = model.GetTypes(); foreach (Type type in types) { Console.WriteLine("类型:" + type); //MemberInfo[] menberInfo = type.GetMembers(); //foreach (MemberInfo mi in menberInfo) //{ // Console.WriteLine("成员:"+mi.ToString()+"类型:"+mi.MemberType); //} //Console.WriteLine(); //FieldInfo[] fields = type.GetFields(); //foreach (FieldInfo fi in fields) //{ // Console.WriteLine("名称:"+fi.Name+"类型:"+fi.FieldType+"特性:"+fi.Attributes); //} //Console.WriteLine(); //PropertyInfo[] pis = type.GetProperties(); //foreach (PropertyInfo pi in pis) //{ // Console.WriteLine("名称:" + pi.Name + "类型:" + pi.PropertyType + "特性:" + pi.Attributes+"可读:"+pi.CanRead+"可写"+pi.CanWrite); //} MethodInfo[] meis = type.GetMethods(); foreach (MethodInfo mei in meis) { Console.WriteLine("名称:"+mei.Name+" 签名:"+mei.ToString()+"返回值类型:"+mei.ReturnType); } } } }
标签:
原文地址:http://blog.csdn.net/heyangyi_19940703/article/details/51338611