Assembly.GetTypes () для вложенных классов - PullRequest
7 голосов
/ 21 июня 2010

Assmbly.GetTpes () получает типы в сборке, но если мне также нужен вложенный класс (OrderLine), как мне это сделать?Я знаю только имя сборки, а не имена классов, поэтому GetType (Order + OrderLine) не будет работать.

public class Order
{
  public class OrderLine
  {
  }
}

Ответы [ 3 ]

7 голосов
/ 21 июня 2010

Я не знаю, должно ли assembly.GetTypes() включать вложенные классы. Предполагая, что это не так, метод, подобный следующему, может перебирать все типы сборок.

IEnumerable<Type> AllTypes(Assembly assembly)
{
    foreach (Type type in assembly.GetTypes())
    {
        yield return type;        
        foreach (Type nestedType in type.GetNestedTypes())
        {
            yield return nestedType;
        }
    }
}

Edit:
MSDN имеет следующее , чтобы сказать о Assembly.GetTypes

Возвращенный массив содержит вложенные типы.

Так что на самом деле мой ответ выше не должен быть необходим. Вы должны найти Order и Order+OrderLine, возвращаемые как типы к Assembly.GetTypes.

4 голосов
/ 21 июня 2010

Примерно так:


Assembly.GetTypes().SelectMany(t => new [] { t }.Concat(t.GetNestedTypes()));
0 голосов
/ 21 июня 2010

Вы можете использовать оператор LINQ. Я не уверен на 100%, что вы пытаетесь сделать, но вы можете сделать что-то вроде этого.

Assembly.GetTypes().Where(type => type.IsSubclassOf(SomeType) && type.Whatever);

Редактировать

Если обычный Assembly.GetTypes() не возвращает вложенный класс, вы можете перебрать массив и добавить все, что вы найдете в CurrentType.GetNestedTypes(), в массив. как

 var allTypes = new List<Type>();
 var types = Assembly.GetTypes();
 allTypes.AddRange(types);
 foreach(var type in types)
 {
     allTypes.AddRange(type.GetNestedTypes());
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...