public static IEnumerable<ISyntaxEvaluation> GetSyntaxRules(ISpellChecker spellChecker)
{
var types = (from type in typeof(AllRules).Assembly.GetTypes()
where typeof(ISyntaxEvaluation).IsAssignableFrom(type)
where !type.IsInterface && !type.IsAbstract
select type).AsArray();
var simple =
types.Where(x => x.GetConstructors().Any(c => c.GetParameters().Length == 0))
.Select(Activator.CreateInstance)
.Cast<ISyntaxEvaluation>();
var spelling =
types.Where(
x =>
x.GetConstructors()
.Any(
c => c.GetParameters().Length == 1 && typeof(ISpellChecker).IsAssignableFrom(c.GetParameters()[0].ParameterType)))
.Select(x => Activator.CreateInstance(x, spellChecker))
.Cast<ISyntaxEvaluation>();
return simple.Concat(spelling).OrderBy(x => x.ID).AsArray();
}