using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; using System.Text; using WCS.Core.BaseExtensions; namespace WCS.Core.Helpers { /// /// 反射辅助类 /// public class ReflectionHelper { /// /// 创建指定类型的实例 /// /// /// /// public static TModel CreateInstance(Type type) => (TModel)ReflectionHelper.CreateInstance(type); /// /// 创建指定类型的实例 /// /// /// public static object CreateInstance(Type type) => Activator.CreateInstance(type); /// /// 从当前程序中 获取所有实现指定接口的类型 /// /// /// public static List GetTypesByImplementInterface() where TInterface : class => GetAssemblies().SelectMany(GetTypesByImplementInterface).ToList(); /// /// 从指定的程序集里 获取所有实现指定接口的类型 /// /// /// /// public static List GetTypesByImplementInterface(Assembly assembly) where TInterface : class { try { return assembly.GetTypes() //获取该程序集中所有的类 .Where(type => !string.IsNullOrWhiteSpace(type.Namespace))//命名空间不为空 .Where(type => type.GetTypeInfo().IsClass) //必须要有类 .Where(type => type.GetTypeInfo().BaseType != null)//基本类型不为空 .Where(type => !type.GetTypeInfo().IsAbstract) //没有作废弃用 // IsAssignableFrom // 方法的作用 // a对象所对应类信息是b对象所对应的类信息的父类或者是父接口,简单理解即a是b的父类或接口 a对象所对应类信息与b对象所对应的类信息相同,简单理解即a和b为同一个类或同一个接口 .Where(type => typeof(TInterface).IsAssignableFrom(type))// 当前类是否继承或指定接口 .ToList(); } catch { return new List(); } } /// /// 从指定的程序集里 获取所有实现指定接口的类型 /// /// /// /// public static List GetTypesByImplementInterface(List assemblies) where TInterface : class { try { List types = new List(); assemblies.ForEach(p => { types.AddRange(p.GetTypes() //获取该程序集中所有的类 .Where(type => !string.IsNullOrWhiteSpace(type.Namespace))//命名空间不为空 .Where(type => type.GetTypeInfo().IsClass) //必须要有类 .Where(type => type.GetTypeInfo().BaseType != null)//基本类型不为空 .Where(type => !type.GetTypeInfo().IsAbstract) //没有作废弃用 // IsAssignableFrom // 方法的作用 // a对象所对应类信息是b对象所对应的类信息的父类或者是父接口,简单理解即a是b的父类或接口 a对象所对应类信息与b对象所对应的类信息相同,简单理解即a和b为同一个类或同一个接口 .Where(type => typeof(TInterface).IsAssignableFrom(type))// 当前类是否继承或指定接口 .ToList()); }); return types; } catch { return new List(); } } /// /// 获取项目中所有程序集 (注意,排除了一些指定的程序集) /// /// AppContext.BaseDirectory 方法的作用是获取程序所在目录 /// public static List GetAssemblies() { var assemblies = new List(); foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies()) { assembly.GetReferencedAssemblies().RemoveTheAssemblyNamespecified().ToList() .ForEach(p => { try { assemblies.Add(Assembly.Load(p)); } catch (Exception ex) { Log(" 警告! 加载程序集失败:" + p.FullName); Log(" 错误: " + ex.Message); } }); } assemblies.AddRange(GetAssemblies(AppContext.BaseDirectory)); return assemblies.RemoveDuplicateAssemblies().ToList(); } /// /// 从指定的目录开始,提取所有可用的程序集,向上查找引用的 /// /// /// public static List GetAssemblies(string path) { var source = new List(); //需要返回的数据集合 foreach (var file in Directory.GetFiles(path, "*.dll"))//读取指定目录中所有的DLL文件路径,并遍历 { //try //{ var a = Assembly.GetEntryAssembly(); var assembly = Assembly.LoadFrom(file); //将获取到的程序集加载出来 source.Add(assembly); //将该程序集加入到需要返回的数据中 //找到所有引用过这个程序集的程序集的名称,并进行遍历 assembly.GetReferencedAssemblies().RemoveTheAssemblyNamespecified().ToList() .ForEach(p => { try { source.Add(Assembly.Load(p)); } catch (Exception ex) { Log(" 警告! 加载程序集失败:" + p.FullName); Log(" 错误: " + ex.Message); } }); //} //catch (Exception ex) //{ // Log(" 警告! 提取程序集失败:" + file); // Log(" 错误: " + ex.Message); //} } return source.DistinctBy(p => p.FullName).ToList(); } /// /// 写日志 /// /// 日志内容 private static void Log(string _) { } } }