/// <summary> /// Gets the filtered types from assemblies. /// </summary> /// <param name="cacheName">Name of the cache.</param> /// <param name="predicate">The predicate.</param> /// <param name="assemblies">The assemblies.</param> /// <returns></returns> public IEnumerable <Type> GetFilteredTypesFromAssemblies(string cacheName, Predicate <Type> predicate, IEnumerable <Assembly> assemblies) { var matchingTypes = TypeCacheManager.ReadTypesFromCache(BuildManager, cacheName, predicate, Serializer); if (matchingTypes == null) { matchingTypes = FilterTypesInAssemblies(BuildManager, predicate, assemblies) .ToList(); TypeCacheManager.SaveTypesToCache(BuildManager, cacheName, matchingTypes, Serializer); } return(matchingTypes); }
private static IEnumerable <Type> FilterTypesInAssemblies(IBuildManager buildManager, Predicate <Type> predicate, IEnumerable <Assembly> assemblies) { IEnumerable <Type> foundTypes = Type.EmptyTypes; foreach (var assembly in assemblies) { Type[] types; try { types = assembly.GetTypes(); } catch (ReflectionTypeLoadException exception) { types = exception.Types; } foundTypes = foundTypes.Concat(types.Where(type => TypeCacheManager.TypeIsPublicClass(type) && predicate(type))); } return(foundTypes); }