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

来源:互联网 发布:网民数据统计 编辑:程序博客网 时间:2024/03/29 16:45

上一篇博客写了关于反射的一些概念性和基础性的知识,这篇博客总结一下在反射中最常用的一些类的使用,我自己对于反射第一印象就是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类中还有很多常用的方法及属性,还需不断的探索和使用!




0 1
原创粉丝点击