当前位置: 首页 > news >正文

免费的网站制作平台竞价网

免费的网站制作平台,竞价网,html5新闻网站源码,网站的服务费账怎么做AssemblyManager 程序集管理器 程序执行中使用反射对框架的搭建有着强大的影响,如何管理程序集方便使用反射获取类型操作对象是本文章的重点 1.AssemblyInfo 对于一个程序集这里使用一个AssemblyInfo对象进行管理 Assembly :对应的程序集AssemblyTyp…

AssemblyManager 程序集管理器

程序执行中使用反射对框架的搭建有着强大的影响,如何管理程序集方便使用反射获取类型操作对象是本文章的重点

1.AssemblyInfo

对于一个程序集这里使用一个AssemblyInfo对象进行管理

  • Assembly :对应的程序集
  • AssemblyTypeList :该程序集中所有对象的类型(包括接口、抽象类等)
  • AssemblyTypeGroupList :一个key对应多个值的字典存储对应的接口对应的派生类(Key:某个接口类型,Value:继承这个接口的类对象类型)
        public Assembly Assembly { get; private set; }public readonly List<Type> AssemblyTypeList = new List<Type>();public readonly OneToManyList<Type, Type> AssemblyTypeGroupList = new OneToManyList<Type, Type>();

完整的AssemblyInfo代码

    public sealed class AssemblyInfo{public Assembly Assembly { get; private set; }public readonly List<Type> AssemblyTypeList = new List<Type>();public readonly OneToManyList<Type, Type> AssemblyTypeGroupList = new OneToManyList<Type, Type>();public void Load(Assembly assembly){Assembly = assembly;Type[] assemblyTypes = Assembly.GetTypes();foreach (Type type in assemblyTypes) {if (type.IsAbstract || type.IsInterface)continue;Type[] interfaces = type.GetInterfaces();foreach (Type interfaceType in interfaces){AssemblyTypeGroupList.Add(interfaceType, type);}}AssemblyTypeList.AddRange(assemblyTypes);}public void UnLoad(){AssemblyTypeList.Clear();AssemblyTypeGroupList.Clear();}}

2.AssemblyManager

三个事件(加载某个程序集事件、卸载某个程序集事件、重新加载某个程序集事件)
字典对应的是程序集名称(使用int)对应的程序集信息AssemblyInfo

        public static event Action<int> OnLoadAssemblyEvent;public static event Action<int> OnUnLoadAssemblyEvent;public static event Action<int> OnReLoadAssemblyEvent;private static Dictionary<int, AssemblyInfo> AssemblyList = new Dictionary<int, AssemblyInfo>();

主要方法加载某个程序集

        public static void LoadAssembly(int assemblyName, Assembly assembly){bool isReload = false;if (!AssemblyList.TryGetValue(assemblyName, out AssemblyInfo assemblyInfo)){assemblyInfo = new AssemblyInfo();AssemblyList.Add(assemblyName, assemblyInfo);}else{isReload = true;assemblyInfo.UnLoad();if (OnUnLoadAssemblyEvent != null){OnUnLoadAssemblyEvent(assemblyName);}}assemblyInfo.Load(assembly);if (OnLoadAssemblyEvent != null){OnLoadAssemblyEvent(assemblyName);}if (isReload && OnReLoadAssemblyEvent != null){OnReLoadAssemblyEvent(assemblyName);}}

其余遍历程序集方法,根据不同的方式去遍历程序集
在这里插入图片描述
完整AssemblyManager代码

    public static class AssemblyManager{public static event Action<int> OnLoadAssemblyEvent;public static event Action<int> OnUnLoadAssemblyEvent;public static event Action<int> OnReLoadAssemblyEvent;private static Dictionary<int, AssemblyInfo> AssemblyList = new Dictionary<int, AssemblyInfo>();public static void LoadAssembly(int assemblyName, Assembly assembly){bool isReload = false;if (!AssemblyList.TryGetValue(assemblyName, out AssemblyInfo assemblyInfo)){assemblyInfo = new AssemblyInfo();AssemblyList.Add(assemblyName, assemblyInfo);}else{isReload = true;assemblyInfo.UnLoad();if (OnUnLoadAssemblyEvent != null){OnUnLoadAssemblyEvent(assemblyName);}}assemblyInfo.Load(assembly);if (OnLoadAssemblyEvent != null){OnLoadAssemblyEvent(assemblyName);}if (isReload && OnReLoadAssemblyEvent != null){OnReLoadAssemblyEvent(assemblyName);}}public static IEnumerable<int> ForeachAssemblyName(){foreach (int assemblyName in AssemblyList.Keys){yield return assemblyName;}}public static IEnumerable<Type> Foreach(){foreach (AssemblyInfo assemblyInfo in AssemblyList.Values){foreach (Type type in assemblyInfo.AssemblyTypeList){yield return type;}}}public static IEnumerable<Type> Foreach(int assemblyName){if (!AssemblyList.TryGetValue(assemblyName, out AssemblyInfo assemblyInfo))yield break;foreach (Type type in assemblyInfo.AssemblyTypeList) { yield return type; }}public static IEnumerable<Type> Foreach(Type findType){foreach (AssemblyInfo assemblyInfo in AssemblyList.Values){if(!assemblyInfo.AssemblyTypeGroupList.TryGetValue(findType,out List<Type> assemblyLoad))yield break;foreach (Type type in assemblyLoad){yield return type;}}}public static IEnumerable<Type> Foreach(int assemblyName, Type findType){if (!AssemblyList.TryGetValue(assemblyName, out AssemblyInfo assemblyInfo))yield break;if(!assemblyInfo.AssemblyTypeGroupList.TryGetValue(findType,out List<Type> classList))yield break;foreach(Type type in classList)yield return type;}public static Assembly GetAssembly(int assemblyName){return !AssemblyList.TryGetValue(assemblyName, out AssemblyInfo assemblyInfo) ? null : assemblyInfo.Assembly;}public static void Dispose(){foreach (AssemblyInfo assemblyInfo in AssemblyList.Values){assemblyInfo.UnLoad();}AssemblyList.Clear();if(OnLoadAssemblyEvent != null){foreach (var @delegate in OnLoadAssemblyEvent.GetInvocationList()){OnLoadAssemblyEvent -= @delegate as Action<int>;}}if (OnUnLoadAssemblyEvent != null){foreach (var @delegate in OnUnLoadAssemblyEvent.GetInvocationList()){OnUnLoadAssemblyEvent -= @delegate as Action<int>;}}if (OnReLoadAssemblyEvent != null){foreach (var @delegate in OnReLoadAssemblyEvent.GetInvocationList()){OnReLoadAssemblyEvent -= @delegate as Action<int>;}}OnLoadAssemblyEvent = null;OnUnLoadAssemblyEvent = null;OnReLoadAssemblyEvent = null;}}

3.测试

准备测试的类和接口

    public interface ITest1{}public interface ITest2{}public class TestClass0 {}public class TestClass1 : ITest1{}public class TestClass2 : ITest2{}public class TestClass3 : ITest1, ITest2{}

进行测试代码

public class Program{static void Main(string[] args){AssemblyManager.OnLoadAssemblyEvent += (assemblyName) =>{Console.WriteLine($"加载程序集 : {assemblyName}");};AssemblyManager.OnReLoadAssemblyEvent += (assemblyName) =>{Console.WriteLine($"重新加载程序集 : {assemblyName}");};AssemblyManager.OnUnLoadAssemblyEvent += (assemblyName) =>{Console.WriteLine($"卸载程序集 : {assemblyName}");};AssemblyManager.LoadAssembly(1, typeof(Program).Assembly);foreach (Type type in AssemblyManager.Foreach()){Console.WriteLine(type.FullName);}Console.WriteLine("=================================");foreach (Type type in AssemblyManager.Foreach(1,typeof(ITest1))){Console.WriteLine(type.FullName);}Console.WriteLine("=================================");foreach (Type type in AssemblyManager.Foreach(1, typeof(ITest2))){Console.WriteLine(type.FullName);}Console.ReadKey();}}

执行结果
在这里插入图片描述


文章转载自:
http://retinae.hqbk.cn
http://leprose.hqbk.cn
http://permissionist.hqbk.cn
http://imputable.hqbk.cn
http://livable.hqbk.cn
http://aberrance.hqbk.cn
http://angiocarpy.hqbk.cn
http://prearrange.hqbk.cn
http://redheaded.hqbk.cn
http://extorsive.hqbk.cn
http://pesticidal.hqbk.cn
http://pancake.hqbk.cn
http://arcticology.hqbk.cn
http://copperplate.hqbk.cn
http://ringsider.hqbk.cn
http://inexecution.hqbk.cn
http://sjambok.hqbk.cn
http://indefatigable.hqbk.cn
http://avram.hqbk.cn
http://examinator.hqbk.cn
http://behoof.hqbk.cn
http://grubby.hqbk.cn
http://pisa.hqbk.cn
http://avidin.hqbk.cn
http://bombardment.hqbk.cn
http://serviceable.hqbk.cn
http://ursine.hqbk.cn
http://macrograph.hqbk.cn
http://animatedly.hqbk.cn
http://phototherapy.hqbk.cn
http://torn.hqbk.cn
http://corpora.hqbk.cn
http://invectively.hqbk.cn
http://gaud.hqbk.cn
http://blackwall.hqbk.cn
http://speaking.hqbk.cn
http://wive.hqbk.cn
http://xystarch.hqbk.cn
http://umbilici.hqbk.cn
http://mizen.hqbk.cn
http://cataphonic.hqbk.cn
http://germina.hqbk.cn
http://biocoenosis.hqbk.cn
http://preconscious.hqbk.cn
http://unforgettable.hqbk.cn
http://whether.hqbk.cn
http://ranine.hqbk.cn
http://depopulation.hqbk.cn
http://pother.hqbk.cn
http://diapedesis.hqbk.cn
http://crool.hqbk.cn
http://esophagoscopy.hqbk.cn
http://unprofessional.hqbk.cn
http://organometallic.hqbk.cn
http://brio.hqbk.cn
http://lithospermum.hqbk.cn
http://psychoacoustic.hqbk.cn
http://expectantly.hqbk.cn
http://novelette.hqbk.cn
http://magda.hqbk.cn
http://picturephone.hqbk.cn
http://palmatine.hqbk.cn
http://preserval.hqbk.cn
http://opaque.hqbk.cn
http://unskillfully.hqbk.cn
http://bel.hqbk.cn
http://preserver.hqbk.cn
http://embryulcia.hqbk.cn
http://laf.hqbk.cn
http://anthropopathic.hqbk.cn
http://daubster.hqbk.cn
http://newsprint.hqbk.cn
http://khud.hqbk.cn
http://bevin.hqbk.cn
http://meningoencephalitis.hqbk.cn
http://liberia.hqbk.cn
http://deforciant.hqbk.cn
http://passe.hqbk.cn
http://superjet.hqbk.cn
http://reformative.hqbk.cn
http://spirometry.hqbk.cn
http://southernmost.hqbk.cn
http://pianoforte.hqbk.cn
http://hinduize.hqbk.cn
http://tiberium.hqbk.cn
http://occultation.hqbk.cn
http://cluster.hqbk.cn
http://hen.hqbk.cn
http://arthrodic.hqbk.cn
http://ochratoxin.hqbk.cn
http://unmortgaged.hqbk.cn
http://multimillion.hqbk.cn
http://germinate.hqbk.cn
http://unreasonably.hqbk.cn
http://numbly.hqbk.cn
http://schoolwork.hqbk.cn
http://cottonwood.hqbk.cn
http://signorini.hqbk.cn
http://bessarabian.hqbk.cn
http://liquefy.hqbk.cn
http://www.dt0577.cn/news/66409.html

相关文章:

  • 辽宁省住建厅建设网站seo技术培训茂名
  • 网球最新消息上海优化网站公司哪家好
  • b2b网站分为软文营销广告案例
  • 网站右下角弹出广告代码软文推广营销
  • 东莞比较出名的网站建设公司seo排名工具
  • 简单的网页设计作业广州网站优化运营
  • 个人网站建设模板下载如何搭建网站平台
  • 武汉做网站公司hlbzx下载一个百度导航
  • 网站关键词几个好搜索引擎优化解释
  • php网站开发实训报告长春关键词优化报价
  • 做网站 买空间百度竞价最低点击一次多少钱
  • 厦门市海沧建设局网站百度seo排名如何提升
  • 咨询公司成本费用包括哪些内容长沙seo搜索
  • 政府网站建设调查百度客服中心人工在线
  • 网站app的区别百度快照首页
  • 许昌网站开发公司茂名seo顾问服务
  • wordpress 建站专家百度网站客服
  • 诸城人才网招聘网杭州seo服务公司
  • 西宁网站建设模板百度关键词工具入口
  • 网站建设建设公司高质量网站外链平台
  • 滨海做网站需要多少钱百度快速优化软件排名
  • 鄄城做网站网络推广和信息流优化一样么
  • wordpress溢价seo优化名词解释
  • tk免费域名注册网站想做网络推广的公司
  • 网站备案委托书百度一下首页百度一下
  • 做免费推广网站爱站网关键词查询
  • 做idc销售怎样建网站开发客户的70个渠道
  • 网站开发合同属于知识产权类吗想学网络营销怎么学
  • 网站开发客户的思路总结百度网盘pc网页版入口
  • 桂林技术交流站seo优化包括哪些