C #: список всех классов в сборке


103

Я хочу вывести (программно - C #) список всех классов в моей сборке.

Любые подсказки или пример кода, как это сделать? Отражение?


Если вы намерены изучить сборку, на которую не ссылается ваш проект, см. Мой обновленный ответ.
Thorarin

Ответы:


152

Используйте Assembly.GetTypes. Например:

Assembly mscorlib = typeof(string).Assembly;
foreach (Type type in mscorlib.GetTypes())
{
    Console.WriteLine(type.FullName);
}

1
Есть предложения для больших сборок? Когда я запускаю этот код для сборки размером 13,8 МБ, мой экземпляр VS зависает на неопределенное время. Я попробовал небольшую сборку размером 9 КБ, и она сработала нормально. Я знаю, о чем вы думаете - почему у вас сборка размером 13,8 МБ - это часть моего уровня данных, созданного с использованием шаблона NetTeirs. У нас много таблиц.
dyslexicanaboko

1
@dyslexicanaboko: Что ж, если у вас много типов, то потребуется много времени, чтобы их все перечислить. Сколько видов находятся в сборке , хотя? И что ты с ними делаешь? (Вы уверены, что проблема в извлечении типов или просто в том, что вы делаете потом?)
Джон Скит

Я не могу обойти вызов asm.GetTypes (), он просто зависает - я имею в виду, очевидно, что существует много типов - я ничего не могу сделать, потому что он пытается получить их все . Мой процессор загружается до 30% на одном из моих 4 ядер. Я имею в виду, что на самом деле мне просто интересно, есть ли способ сказать: «Эй, смотрите только в ЭТО пространство имен» - у меня сложилось впечатление, что это невозможно, потому что метод GetTypes () имеет только пустой конструктор. Я пытаюсь создать своего рода обозреватель объектов.
dyslexicanaboko

1
Хорошая мысль, я еще не пробовал. Моя работа на данный момент заключается в том, чтобы просто настроить таргетинг на классы напрямую, используя asm.GetType (полностьюQualifiedClassName) - это работает, но показать список классов пользователю невозможно, что я и хотел. Это не клиент, кстати, я использую его для себя и других разработчиков.
dyslexicanaboko

1
@DebugErr: Да, достаточно просто сделать это просто классами, если хотите, но я предполагаю, что OP, вероятно, действительно хотел все типы.
Джон Скит,

102

Я просто хотел бы добавить к примеру Джона. Чтобы получить ссылку на собственную сборку, вы можете использовать:

Assembly myAssembly = Assembly.GetExecutingAssembly();

System.Reflection пространство имен.

Если вы хотите изучить сборку, на которую у вас нет ссылки, вы можете использовать любое из них:

Assembly assembly = Assembly.ReflectionOnlyLoad(fullAssemblyName);
Assembly assembly = Assembly.ReflectionOnlyLoadFrom(fileName);

Если вы собираетесь создать экземпляр своего типа после того, как найдете его:

Assembly assembly = Assembly.Load(fullAssemblyName);
Assembly assembly = Assembly.LoadFrom(fileName);

См. Документацию класса Assembly для получения дополнительной информации.

Если у вас есть ссылка на Assemblyобъект, вы можете использовать, assembly.GetTypes()как уже продемонстрировал Джон.


Как я могу ссылаться на совершенно другую сборку, которая есть в моем решении?
Alex

13
Самый простой способ - использовать typeofтип, который, как вы знаете, находится в этой сборке, а затем Assemblyсвойство, как в моем примере.
Джон Скит,

2
Если вы хотите сослаться на сборку, скажем abc.dll, которая есть в вашем решении, и если вы в порядке, жестко запрограммировав имя dll, другой подход к ссылке на сборку: `Assembly assembly = Assembly.Load (" abc ");
Kash

Загружает только текущую сборку. У меня есть приложение или exe с использованием 4 DLL или проектов. Как я могу получить имена классов этих dll?
Эр Маянк

@JonSkeet Как этого добиться в «современной» среде C #? Например, при разработке UWP. UWP не имеет метода GetExecutingAssembly ().
Дэниел Армстронг,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.