一.在.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类型,这两个类型封装了类型的构造函数和事件信息。查看这些信息和上述方法类似。