Как да заредя пространство от имена Системни класове?

Имам малък въпрос. Намерих това в интернет:

Type t = typeof(MyClass);
MethodInfo[] mi = t.GetMethods();

Има ли някакъв начин как да направите същото с пространствата от имена? Или има някакъв друг начин да получите всички класове с имена и екземпляри на System.Type? Преди много време намерих нещо за изброяване на библиотеката. Моля, някой да ми помогне.


person user35443    schedule 27.03.2012    source източник
comment
Можете да получите всички класове от системния модул, като използвате този малък хак: typeof(string).Assembly.GetTypes().   -  person Sergey Kalinichenko    schedule 27.03.2012
comment
Добре. Но какво трябва да направя, ако трябва да го взема например от System.IO?   -  person user35443    schedule 27.03.2012
comment
възможен дубликат на Намиране на всички пространства от имена в сборка с помощта на Reflection (DotNET)   -  person Bernard    schedule 27.03.2012
comment
И моля, напишете го като отговор. Ще го отбележа.   -  person user35443    schedule 27.03.2012
comment
@dasblinkenlight, който ще получи всичко в сборката mscorlib, а не System.   -  person vcsjones    schedule 27.03.2012
comment
Всеки тип има свойство Namespace, можете да филтрирате по него с помощта на LINQ или foreach цикъл, каквото предпочитате.   -  person Sergey Kalinichenko    schedule 27.03.2012
comment
О, нещата от System.IO също ще бъдат там: mscorlib има 2500+ класа.   -  person Sergey Kalinichenko    schedule 27.03.2012
comment
Не забравяйте, че няма връзка едно към едно (или едно към много) между асембли и пространства от имена. Едно асемблиране може да съдържа много пространства от имена (не е голяма изненада), но едно пространство от имена може също да бъде дефинирано в множество асембли. По същество връзката е много към много. Искането за всички типове в определено пространство от имена не е добре дефинирано, освен ако не споменете кои асембли да търсите.   -  person Martin Liversage    schedule 27.03.2012
comment
Да, сега го правя. Но направих грешка, защото понякога, когато използвам сокети, трябва да добавя System.Net към препратки във Viusal Studio...   -  person user35443    schedule 27.03.2012


Отговори (2)


Можете да получите всички класове от сборката mscorlib, като използвате този малък хак: typeof(string).Assembly.GetTypes(). Можете допълнително да го филтрирате по свойството FullName или Namespace.

person Sergey Kalinichenko    schedule 27.03.2012

Ако искате да получите всички класове в определено пространство от имена, можете да направите нещо подобно:

var types = from type
            in AppDomain.CurrentDomain.GetAssemblies().SelectMany(a => a.GetTypes())
            where type.Namespace == "System"
            select type;

Това ще изглежда във всички заредени сборки за всеки тип в пространството от имена System. Можете, разбира се, да промените "System" на всичко друго, което искате, като например "System.IO".

person vcsjones    schedule 27.03.2012
comment
Много благодаря. Вашето решение изглежда страхотно, но той беше първи. - person user35443; 27.03.2012