分类信息网站做淘客小白如何自己做网站

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

分类信息网站做淘客,小白如何自己做网站,wordpress分页调用代码,网站制作培训多少钱AssemblyManager 程序集管理器 程序执行中使用反射对框架的搭建有着强大的影响#xff0c;如何管理程序集方便使用反射获取类型操作对象是本文章的重点 1.AssemblyInfo 对于一个程序集这里使用一个AssemblyInfo对象进行管理 Assembly #xff1a;对应的程序集AssemblyTyp…AssemblyManager 程序集管理器 程序执行中使用反射对框架的搭建有着强大的影响如何管理程序集方便使用反射获取类型操作对象是本文章的重点 1.AssemblyInfo 对于一个程序集这里使用一个AssemblyInfo对象进行管理 Assembly 对应的程序集AssemblyTypeList 该程序集中所有对象的类型包括接口、抽象类等AssemblyTypeGroupList 一个key对应多个值的字典存储对应的接口对应的派生类Key某个接口类型Value继承这个接口的类对象类型 public Assembly Assembly { get; private set; }public readonly ListType AssemblyTypeList new ListType();public readonly OneToManyListType, Type AssemblyTypeGroupList new OneToManyListType, Type();完整的AssemblyInfo代码 public sealed class AssemblyInfo{public Assembly Assembly { get; private set; }public readonly ListType AssemblyTypeList new ListType();public readonly OneToManyListType, Type AssemblyTypeGroupList new OneToManyListType, 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 Actionint OnLoadAssemblyEvent;public static event Actionint OnUnLoadAssemblyEvent;public static event Actionint OnReLoadAssemblyEvent;private static Dictionaryint, AssemblyInfo AssemblyList new Dictionaryint, 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 Actionint OnLoadAssemblyEvent;public static event Actionint OnUnLoadAssemblyEvent;public static event Actionint OnReLoadAssemblyEvent;private static Dictionaryint, AssemblyInfo AssemblyList new Dictionaryint, 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 IEnumerableint ForeachAssemblyName(){foreach (int assemblyName in AssemblyList.Keys){yield return assemblyName;}}public static IEnumerableType Foreach(){foreach (AssemblyInfo assemblyInfo in AssemblyList.Values){foreach (Type type in assemblyInfo.AssemblyTypeList){yield return type;}}}public static IEnumerableType Foreach(int assemblyName){if (!AssemblyList.TryGetValue(assemblyName, out AssemblyInfo assemblyInfo))yield break;foreach (Type type in assemblyInfo.AssemblyTypeList) { yield return type; }}public static IEnumerableType Foreach(Type findType){foreach (AssemblyInfo assemblyInfo in AssemblyList.Values){if(!assemblyInfo.AssemblyTypeGroupList.TryGetValue(findType,out ListType assemblyLoad))yield break;foreach (Type type in assemblyLoad){yield return type;}}}public static IEnumerableType Foreach(int assemblyName, Type findType){if (!AssemblyList.TryGetValue(assemblyName, out AssemblyInfo assemblyInfo))yield break;if(!assemblyInfo.AssemblyTypeGroupList.TryGetValue(findType,out ListType 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 Actionint;}}if (OnUnLoadAssemblyEvent ! null){foreach (var delegate in OnUnLoadAssemblyEvent.GetInvocationList()){OnUnLoadAssemblyEvent - delegate as Actionint;}}if (OnReLoadAssemblyEvent ! null){foreach (var delegate in OnReLoadAssemblyEvent.GetInvocationList()){OnReLoadAssemblyEvent - delegate as Actionint;}}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();}}执行结果