C #: Список усіх класів в зборах


103

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

Будь-які підказки чи зразок коду, як це зробити? Рефлексія?


Якщо ви маєте намір вивчити збірку, на яку не посилається ваш проект, дивіться мою оновлену відповідь.
Торарін

Відповіді:


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. У нас багато таблиць.
dislexicanaboko

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

Я не можу оминути виклик asm.GetTypes (), він просто зависає - я маю на увазі, це очевидно факт, що існує багато типів - я нічого не можу зробити, тому що він намагається пробути їх усіх . Мій процесор стріляє до 30% на одному з моїх 4 ядер. Я маю на увазі насправді мені просто цікаво, чи є спосіб сказати: «Ей, тільки дивись у ЦЕЙ ПРОСТІЙ імен» - я маю враження, що це неможливо, оскільки метод GetTypes () має лише порожній конструктор. Я намагаюся зробити об’єктний браузер, який завгодно.
dyslexicanaboko

1
Добре, я ще цього не пробував. Наразі моя робота полягає в тому, щоб просто орієнтуватися на класи безпосередньо за допомогою asm.GetType (fullQualifiedClassName) - це працює, але показ списку класів користувачеві неможливий, чого я хотів. Це не клієнт, який стикається з btw, я використовую його внутрішньо для себе та інших розробників.
dislexicanaboko

1
@DebugErr: Так - досить просто зробити це просто класами, якщо хочете, але я гадаю, що ОП, мабуть, дуже хотіла всіх типів.
Джон Скіт

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.GetTypes()як Джон вже демонстрував.


Як я міг посилатися на зовсім іншу збірку, яка є в моєму рішенні?
Олексій

13
Найпростіший спосіб - це використовувати typeofтип, який ви знаєте, у цій збірці, а потім у Assemblyвластивості, як у моєму прикладі.
Джон Скіт

2
Якщо ви хочете посилатися на збірку, скажімо, abc.dll, що є у вашому рішенні, і якщо ви все в порядку, жорстке кодування імені dll, іншим підходом до посилання на збірку є: `Assembly Assembly = Assembly.Load (" abc ");`
Каш

Він завантажує тільки поточну збірку. У мене є програма або exe з використанням 4 dll або проектів. Як я можу отримати назви класів цих dll?
Er Mayank

@JonSkeet Як цього можна досягти в "сучасному" середовищі c #? Як, наприклад, при розробці UWP. UWP не має методу GetExecutingAssembly ().
Даніель Армстронг
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.