概述
一直以來,我們都在用C#編寫程序,編寫程序的時候,我們用到繼承、多態、接口以及泛型,我們也都明白子類可以繼承抽象類,並能夠重寫父類的抽象方法,可是大家是否想過,如下幾個問題:
1、凡樹必有根和葉,類的繼承也如此,如何通過程序集查找所有繼承父類的之類的程序集名稱?
2、如果程序B被其他程序調用,如何通過程序集查詢調用B的所有程序?
3、如何查詢當前項目通過添加引用了哪些程序集?
帶上上面的三個問題,我們來學習下.NET 程序集 Assembly。
查詢繼承父類的程序集合BaseType
.NET的程序集對象Assembly有個屬性BaseType,來返回當前程序集的基礎類型,默認是Object。通過該屬性可以判斷某個程序集是否是繼承了某個父類;
程序集B被A程序引用,獲取A程序集的信息GetCallingAssembly
.NET的程序集對象Assembly有個方法GetCallingAssembly獲取當前程序集被調用的上級程序集的信息;
查找當前項目的程序集GetAssemblies
查找當前項目所有程序集的方法System.AppDomain.CurrentDomain.GetAssemblies();
實例化對象
通過程序集GetType()獲取程序集的數據類型,通過Activator.CreateInstance(type) 便可創建響應的實例對象;
整體使用的代碼如下:BaseService是所有服務類的基類
List<Type> TypeItemList = new List<Type>(); //var ResultTypeList = Assembly.GetEntryAssembly(); //if (ResultTypeList == null) //{ // ResultTypeList = Assembly.GetCallingAssembly(); // var ItemList = ResultTypeList.GetReferencedAssemblies().Where(p => p.GetType() == typeof(BaseService)); //} Assembly[] AssbyCustmList = System.AppDomain.CurrentDomain.GetAssemblies(); foreach (Assembly assItem in AssbyCustmList) { TypeItemList.AddRange(assItem.GetTypes().Where(x => x.BaseType == typeof(BaseService)).ToList()); } //IEnumerable<Type> TypeItemList = CurType.Assembly.GetExportedTypes().Where(x => x.BaseType == typeof(BaseService)).ToList(); //IEnumerable<Type> TypeItemList = ResultTypeList.GetTypes().Where(x => x.BaseType == typeof(BaseService)).ToList(); BaseService TarService = null; foreach (Type typeitem in TypeItemList) { if (_Reporttory.Count(p => p.GetType() == typeitem) == 0) { TarService = (Activator.CreateInstance(typeitem) as BaseService); } else { TarService = _Reporttory.First(p => p.GetType() == typeitem); } TarService.Start(); }