using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using BinaryObjectScanner.Interfaces; namespace BurnOutSharp { /// /// Statically-generated lists of scanning classes /// internal static class ScanningClasses { #region Public Collections /// /// Cache for all IContentCheck types /// public static IEnumerable ContentCheckClasses { get { if (contentCheckClasses == null) contentCheckClasses = InitCheckClasses(); return contentCheckClasses; } } /// /// Cache for all ILinearExecutableCheck types /// public static IEnumerable LinearExecutableCheckClasses { get { if (linearExecutableCheckClasses == null) linearExecutableCheckClasses = InitCheckClasses(); return linearExecutableCheckClasses; } } /// /// Cache for all INewExecutableCheck types /// public static IEnumerable NewExecutableCheckClasses { get { if (newExecutableCheckClasses == null) newExecutableCheckClasses = InitCheckClasses(); return newExecutableCheckClasses; } } /// /// Cache for all IPathCheck types /// public static IEnumerable PathCheckClasses { get { if (pathCheckClasses == null) pathCheckClasses = InitCheckClasses(); return pathCheckClasses; } } /// /// Cache for all IPortableExecutableCheck types /// public static IEnumerable PortableExecutableCheckClasses { get { if (portableExecutableCheckClasses == null) portableExecutableCheckClasses = InitCheckClasses(); return portableExecutableCheckClasses; } } #endregion #region Internal Instances /// /// Cache for all IContentCheck types /// private static IEnumerable contentCheckClasses; /// /// Cache for all ILinearExecutableCheck types /// private static IEnumerable linearExecutableCheckClasses; /// /// Cache for all INewExecutableCheck types /// private static IEnumerable newExecutableCheckClasses; /// /// Cache for all IPathCheck types /// private static IEnumerable pathCheckClasses; /// /// Cache for all IPortableExecutableCheck types /// private static IEnumerable portableExecutableCheckClasses; #endregion #region Initializers /// /// Initialize all implementations of a type /// private static IEnumerable InitCheckClasses() => InitCheckClasses(Assembly.GetExecutingAssembly()) .Concat(InitCheckClasses(typeof(BinaryObjectScanner.Packer._DUMMY).Assembly)) .Concat(InitCheckClasses(typeof(BinaryObjectScanner.Protection._DUMMY).Assembly)); /// /// Initialize all implementations of a type /// private static IEnumerable InitCheckClasses(Assembly assembly) { return assembly.GetTypes() .Where(t => t.IsClass && t.GetInterface(typeof(T).Name) != null) .Select(t => (T)Activator.CreateInstance(t)); } #endregion } }