Everything that you do will be based on heuristics - there is no concrete "this class is static" at the IL level. And there is no guarantee that C # and VB compilers will use static / modules in future releases.
Well, a static class will not have common constructors and will be sealed, so that might be enough:
var types=from m in System.Reflection.Assembly.GetExecutingAssembly().GetTypes()
where m.IsClass && (!m.IsSealed || m.GetConstructors().Any())
select m;
source
share