Используйте отражение для получения списка статических классов

много вопросов близки, но ни один не отвечает на мою проблему...

Как я использую отражение в C# 3.5 для получения всех классов, которые статичны от блока. Я уже получаю все определенные Типы, но нет никакого свойства IsStatic. Подсчет 0 конструкторов является действительно медленным и не работал также.

Какие-либо подсказки или строка кода?:-)

Chris

7
задан Christian Ruppert 14 April 2010 в 17:06
поделиться

4 ответа

Вот как вы получаете типы из сборки:

http://msdn.microsoft.com/en-us/library/system.reflection.assembly.aspx

GetTypes Method

Затем:

Ищите классы, которые одновременно являются абстрактными и запечатанными.

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);
14
ответ дан 6 December 2019 в 09:59
поделиться

Статические классы - это функция C #, а не спецификация общего языка, поэтому в экземпляре Type нет ни одного фрагмента метаданных, который указывал бы на то, что это статический класс. Однако вы можете проверить, является ли это запечатанным типом и все ли его ненаследуемые члены статичны.

1
ответ дан 6 December 2019 в 09:59
поделиться

То, что в C# называется статическим классом, для CLR является абстрактным, закрытым классом. Поэтому вам нужно посмотреть на IsAbstract && IsSealed.

3
ответ дан 6 December 2019 в 09:59
поделиться

Вам необходимо объединить следующие проверки: Abstract, Sealed, BeforeFieldInit. После компиляции статического класса вы можете увидеть следующий код IL в скомпилированной сборке:

.class public abstract auto ansi sealed beforefieldinit StaticClass
    extends [mscorlib]System.Object
{
}
1
ответ дан 6 December 2019 в 09:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: