码迷,mamicode.com
首页 > Windows程序 > 详细

【C#反射程序集】

时间:2016-05-13 03:55:38      阅读:318      评论:0      收藏:0      [点我收藏+]

标签:

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

【C#反射程序集】

标签:

原文地址:http://blog.csdn.net/heyangyi_19940703/article/details/51338611

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!