【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
原创粉丝点击