/// <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);
        }