Используйте отражение, чтобы получить список статических классов - PullRequest
7 голосов
/ 14 апреля 2010

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

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

Какие-нибудь советы или строка кода? : -)

Chris

Ответы [ 4 ]

14 голосов
/ 14 апреля 2010

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

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

Метод GetTypes

Тогда:

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

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);
3 голосов
/ 14 апреля 2010

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

1 голос
/ 14 апреля 2010

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

.class public abstract auto ansi sealed beforefieldinit StaticClass
    extends [mscorlib]System.Object
{
}
1 голос
/ 14 апреля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...