public virtual IEnumerable <Type> Scan() { if (ScannedResultCached) { foreach (var cachedType in ScannedResultCache) { yield return(cachedType); } } else { var assemblies = GetAssemblies(); foreach (var assembly in assemblies) { if (NeedToIgnore(assembly)) { continue; } var types = _typesFilter(assembly); foreach (var type in types) { ScannedResultCache.Add(type); yield return(type); } } ScannedResultCached = true; } // ReSharper disable once InconsistentNaming IEnumerable <Type> _typesFilter(Assembly assembly) => assembly.GetExportedTypes().Where(TypeFilter()); }
protected TypeScanner(string scannerName) { _anonymousDisposableObject = AnonymousDisposableObject.Create(() => { ScannedResultCache.Clear(); ScannedResultCache = null; ScannedResultCached = false; }); }