public static Type[] GetTypesImplementing <T>(string assemblyName = "") { IEnumerable <Assembly> assemblies = null; if (assemblyName.IsNotEmpty() && LoadedAssemblies.Count(a => assemblyName.IsNotEmpty() && a.GetName().Name == assemblyName) > 0) { assemblies = LoadedAssemblies.Where(a => a.FullName.StartsWith(assemblyName)); } else if (assemblyName.IsEmpty()) { assemblies = LoadedAssemblies; } else { throw new InvalidOperationException($"The assembly {assemblyName} is not loaded."); } IEnumerable <Type> types = from type in assemblies.SelectMany(a => a.GetTypes()) where typeof(T).IsAssignableFrom(type) && type.IsClass && !type.IsAbstract select type; return(types.ToArray()); }
public static Type[] GetSubTypes <T>(string assemblyName = "") { IEnumerable <Assembly> assemblies = null; if (assemblyName.IsNotEmpty() && LoadedAssemblies.Count(a => assemblyName.IsNotEmpty() && a.GetName().Name == assemblyName) > 0) { assemblies = LoadedAssemblies.Where(a => a.FullName.StartsWith(assemblyName)); } else if (assemblyName.IsEmpty()) { assemblies = LoadedAssemblies; } else { throw new InvalidOperationException($"The assembly {assemblyName} is not loaded."); } return(assemblies .Select(a => a.GetTypes()) .SelectMany(t => t) .Where(t => t.IsSubclassOf(typeof(T)) && !t.IsAbstract)? .ToArray()); }