【C#反射程序集】

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值