2009-02-10 3 views
1

Так что, если у меня есть экземплярКак получить все базовые типы в сборке?

System.Reflection.Assembly 

и у меня есть следующие модели:

class Person {} 
class Student : Person {} 
class Freshman : Student {} 
class Employee : Person {} 
class PersonList : ArrayList {} 
class StudentList : PersonList {} 

Как я могу перечислить типы Ассамблеи, чтобы получить ссылку на только тип Person и PersonList?

Чтобы быть ясным: я не хочу когда-либо явно указывать тип Person или PersonList во время этого поиска. Person и PersonList являются только корневым типом, определенным в рассматриваемой сборке для этого примера. Я снимаю для общего способа перечисления всех корневых типов для данной сборки.

Спасибо за ваше время :)

ответ

6

Как насчет:

var rootTypes = from type in assembly.GetTypes() 
       where type.IsClass && type.BaseType == typeof(object) 
       select type; 

? Или в терминах, отличных от LINQ:

foreach (Type type in assembly.GetTypes()) 
{ 
    if (type.IsClass && type.BaseType == typeof(object)) 
    { 
     Console.WriteLine(type); 
    } 
} 

EDIT: Нет, это не будет определять PersonList. Вам нужно будет уточнить определение «root». Вы на самом деле имеете в виду «любой тип, базовый тип которого не находится в одной сборке»? Если да, то:

var rootTypes = from type in assembly.GetTypes() 
       where type.IsClass && type.BaseType.Assembly != assembly 
       select type; 
+0

Если сборка имела PersonList как корневой тип, который унаследовал от ArrayList, это все равно будет работать? –

+0

обновленный вопрос, чтобы отразить это. –

+0

Извините, что не ясна. Не знал, как спросить об этом. Вторая половина ответа выглядит великолепно. Попытаюсь. Благодарю. –