много вопросов близки, но ни один не отвечает на мою проблему...
Как я использую отражение в C# 3.5 для получения всех классов, которые статичны от блока. Я уже получаю все определенные Типы, но нет никакого свойства IsStatic. Подсчет 0 конструкторов является действительно медленным и не работал также.
Какие-либо подсказки или строка кода?:-)
Chris
Вот как вы получаете типы из сборки:
http://msdn.microsoft.com/en-us/library/system.reflection.assembly.aspx
Затем:
Ищите классы, которые одновременно являются абстрактными и запечатанными.
http://dotneteers.net/blogs/divedeeper/archive/2008/08/04/QueryingStaticClasses.aspx
При поиске в блогах я смог найти информацию о том, что .NET CLR не знает идеи статических классов, однако позволяет одновременно использовать флаги абстрактного и запечатанного типа. Эти флаги также используются CLR для оптимизации своего поведения, например, используется закрытый флаг для вызова виртуальных методов закрытого класса, таких как невиртуальные. Итак, чтобы спросить, является ли тип статическим или нет, вы можете используйте этот метод:
Из комментария ниже:
IEnumerable<Type> types = typeof(Foo).Assembly.GetTypes().Where
(t => t.IsClass && t.IsSealed && t.IsAbstract);
Статические классы - это функция C #, а не спецификация общего языка, поэтому в экземпляре Type нет ни одного фрагмента метаданных, который указывал бы на то, что это статический класс. Однако вы можете проверить, является ли это запечатанным типом и все ли его ненаследуемые члены статичны.
То, что в C# называется статическим классом, для CLR является абстрактным, закрытым классом. Поэтому вам нужно посмотреть на IsAbstract && IsSealed.
Вам необходимо объединить следующие проверки: Abstract, Sealed, BeforeFieldInit. После компиляции статического класса вы можете увидеть следующий код IL в скомпилированной сборке:
.class public abstract auto ansi sealed beforefieldinit StaticClass
extends [mscorlib]System.Object
{
}