/// <summary> /// /// </summary> /// <param name="baseType"></param> /// <param name="directorySearched"></param> /// <param name="searchChildFolder"></param> /// <param name="config"></param> /// <returns></returns> public static IList <Type> LoadDerivedType(Type baseType, string directorySearched, bool searchChildFolder, TypeLoadConfig config) { if (config == null) { config = new TypeLoadConfig(); } IList <Type> derivedTypeList = new List <Type>(); if (searchChildFolder) { LoadDerivedTypeInAllFolder(baseType, derivedTypeList, directorySearched, config); return(derivedTypeList); } LoadDerivedTypeInOneFolder(baseType, derivedTypeList, directorySearched, config); return(derivedTypeList); }
/// <summary> /// /// </summary> /// <param name="baseType"></param> /// <param name="derivedTypeList"></param> /// <param name="folderPath"></param> /// <param name="config"></param> private static void LoadDerivedTypeInOneFolder(Type baseType, IList <Type> derivedTypeList, string folderPath, TypeLoadConfig config) { string[] files = Directory.GetFiles(folderPath); foreach (string str in files) { if ((config.TargetFilePostfix == null) || str.EndsWith(config.TargetFilePostfix)) { Assembly assembly = null; try { if (config.CopyToMemory) { assembly = Assembly.Load(FileHelper.ReadFileReturnBytes(str)); } else { assembly = Assembly.LoadFrom(str); } } catch (Exception) { } if (assembly != null) { Type[] types = assembly.GetTypes(); foreach (Type type in types) { if ((type.IsSubclassOf(baseType) || baseType.IsAssignableFrom(type)) && (config.LoadAbstractType || !type.IsAbstract)) { derivedTypeList.Add(type); } } } } } }
/// <summary> /// /// </summary> /// <param name="baseType"></param> /// <param name="derivedTypeList"></param> /// <param name="folderPath"></param> /// <param name="config"></param> private static void LoadDerivedTypeInAllFolder(Type baseType, IList <Type> derivedTypeList, string folderPath, TypeLoadConfig config) { LoadDerivedTypeInOneFolder(baseType, derivedTypeList, folderPath, config); string[] directories = Directory.GetDirectories(folderPath); if (directories != null) { foreach (string str in directories) { LoadDerivedTypeInAllFolder(baseType, derivedTypeList, str, config); } } }