【C#反射程序集】
来源:互联网 发布:知乎jennyyy扒皮 编辑:程序博客网 时间:2024/05/16 13:41
一.在.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); }
六.方法信息和MethodInfo类型:
修改面代码:
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); } } } }
还有ConstructorInfo类型和EventInfo类型,这两个类型封装了类型的构造函数和事件信息。查看这些信息和上述方法类似。
2 0
- C# 程序集反射
- 【C#反射程序集】
- C# 程序集 和 反射
- c#程序集及反射
- C#程序集和反射
- C#反射方法:程序集反射、类型反射、接口反射、类型成员反射
- C#2.0学习--反射与程序集
- C#之反射与程序集
- C#之反射与程序集
- 黑马程序员 C# 程序集和反射
- C#中的程序集和反射
- C#中的程序集和反射
- C#中的程序集和反射
- C#2.0学习8--反射与程序集
- C# 完整的反射(调用程序集)
- C#中通过反射查看程序集的特性信息
- C#反射创建对象(根据程序集)
- c#使用反射加载程序集Assembly。load()使用全过程
- jQuery 基础DOM和CSS操作
- MySQL学习5:数据库基本操作
- 软考程序员随笔-----4
- urllib&urllib2库--python2.X(学习日记1)
- ZOJ 3939The Lucky Week (打表预处理/找规律)
- 【C#反射程序集】
- Android通信—信使的使用实现Activity与Service的通信
- Android高级控件(五)——如何打造一个企业级应用对话列表,以QQ,微信为例
- Hello World
- CSS三列自适应布局
- YJPageView
- GRUB Boot Loader
- python 文件读写5个实例
- oracle数据库sql语句