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
}
}