反射(二)-----Assembly类

上一篇博客写了关于反射的一些概念性和基础性的知识,这篇博客总结一下在反射中最常用的一些类的使用,我自己对于反射第一印象就是Assembly,那么它到底是什么意思,有哪些功能呢?总结一下Assembly中最常用的属性和方法

Assembly:

1、常用方法:

CreateInstance从字面意思上看,是创建实例,在Assembly中对其进行了多重实现,最常用的便是:

CreateInstance(String)使用区分大小写的搜索,从此程序集中查找指定的类型,然后使用系统激活器创建它的实例。

实际应用:Assembly.Load().CreateInstance(String)在抽象工厂中通过加载对应的程序集来创建相应的实例。

Equals确定此程序集和指定的对象是否相等

GetAssembly获取在其中定义指定类的当前加载的程序集。

GetCustomAttributes:它也进行了重载,可以返回所有自定义属性集,也可以返回指定类型的自定义属性集

GetModule:获取程序集中指定的模块,GetModules:获取所有模块

GetType()GetType(String):获取当前实例的type,而通过String参数,则可获取具有指定名称的实例的type

应用:

 public System.Type TestReflection() 
        {
            Assembly ass = Assembly.LoadFrom(Server.MapPath("../bin/ITOO.Basic.CommonModel.dll"));
            
            System.Type t = ass.GetType("ITOO.Basic.CommonModel.SchoolLevel");
           // object o = System.Activator.CreateInstance(t);
       
            return t;
        }
那么最终获得t的值:

当然,我们可以不指定具体的类型,对dll中的类型进行遍历,以字符串的形式输出,会将所有dll中所包含的类型名称一一打印出来。

 foreach (var types in ass.GetTypes())
            {
                string typeStr =types.ToString();
                s += typeStr;                                                                                                                                             //string name = types.Name;
                //s +=name+"  ";
            }
        
            return s;

通过types.Name来直接获取类的名称,还有就是Load方法系列,LoadForm,LoadFrom等都是为加载程序集使用的。通过指定具体的路径或名称来加载


在Assembly中还有比较常用的扩展方法:GetCustomAttribute(获取自定义属性集合

以上这些是通过在UI系统中接触到的,上传dll要进行解析,而解析的过程通过反射,也主要是Assembly中的方法来进行解析,这里就把代码直接贴过来啦。

 public class LoadDLL
    {
        private Assembly ass = null;

        /// <summary>
        /// 加载dll
        /// </summary>
        /// <param name="dllPath">dll文件路径</param>
        public LoadDLL(string dllPath)
        {
            this.ass = Assembly.LoadFrom(dllPath);                     //利用dll的路径加载(fullname)
        }

        /// <summary>
        /// 返回反射的dll
        /// </summary>
        /// <returns></returns>
        public Assembly GetAssembly()
        {
            return this.ass;
        }

        /// <summary>
        /// 获取该程序集所引用的所有程序集
        /// </summary>
        /// 
        /// <returns></returns>
        public AssemblyName[] GetReferencedAssemblies()
        {
            return ass.GetReferencedAssemblies();
        }

        /// <summary>
        /// 获取程序集定义的类型
        /// </summary>
        /// 
        /// <returns></returns>
        public Type[] GetTypes()
        {
            Type[] types = ass.GetTypes();
            string name = types[0].Name;

            return types;
        }

        /// <summary>
        /// 获取程序集清单文件表中的文件
        /// </summary>
        /// 
        /// <returns></returns>
        public FileStream[] GetFiles(bool ishert = true)
        {
            return ass.GetFiles(ishert);
        }

        /// <summary>
        /// 获取程序集下的所有模块
        /// </summary>
        /// <param name="getResourceModules">是否获取资源模块</param>
        /// <returns></returns>
        public Module[] GetModules(bool getResourceModules = false)
        {
            return ass.GetModules(getResourceModules);
        }

        /// <summary>
        /// 获取程序集清单文件表中一部分加载的模块
        /// </summary>
        /// <returns></returns>
        public Module[] GetLoadedModules()
        {
            return ass.GetLoadedModules();
        }


        /// <summary>
        /// 获取程序集清单文件表中的所有资源名称
        /// </summary>
        /// 
        /// <returns></returns>
        public string[] GetManifestResourceNames()
        {
            return ass.GetManifestResourceNames();
        }

        /// <summary>
        /// 获取程序集清单文件表中的所有自定义属性
        /// </summary>
        /// <param name="ishert">是否获取集成的属性</param>
        /// <returns></returns>
        public object[] GetCustomAttributes(bool ishert = true)
        {
            return ass.GetCustomAttributes(ishert);
        }
    }
最开始,对反射不是很了解,咋一看,还以为自己定义了个实体呢?但是实体中的一些方法却不是自己定义的,后来才发现是通过反射,组成了这么一个类,来包含对解析dll中的一些操作的方法。在Controller中有通过定义了一个LoadEntityDll(string path)来获取dll中实体类的名称。

以上是UI中用到的一些关于反射的一些代码段,具体怎么解析实体中的属性和字段,就要用到反射中另一个常用的类PropertyInfo这个类了,留在下篇博客总结。Assembly类中还有很多常用的方法及属性,还需不断的探索和使用!




评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值