Пока, переключатель, заявление

I после использовал этот Linq-метод для получения всех типов, наследуемых от базового типа B:

    var listOfBs = (from domainAssembly in AppDomain.CurrentDomain.GetAssemblies()
                    from assemblyType in domainAssembly.GetTypes()
                    where typeof(B).IsAssignableFrom(assemblyType)
                    select assemblyType).ToArray();

EDIT: поскольку это все еще кажется более полным (таким образом, more views), позвольте мне добавить несколько подробностей:

  • Как уже упоминалось выше, этот метод использует Reflection для каждого вызова. Поэтому, когда вы используете метод повторно для одного и того же типа, можно было бы сделать его намного более эффективным, загрузив его один раз.
  • Как показывает Антон , возможно, вы сможете (микро) оптимизировать его используя domainAssembly.GetExportedTypes() для извлечения только общедоступных типов (если это все, что вам нужно).
  • Поскольку Noldorin упоминает, Type.IsAssignable также получит исходный (не производный) тип , (Type.IsSubclassOf не будет, но Type.IsSubclassOf не будет работать, если базовый тип является интерфейсом).
  • Возможно, вам понадобится / нужно проверить «реальный» класс: && ! assemblyType.IsAbstract. (Обратите внимание, что все интерфейсы считаются абстрактными, см. MSDN .)

0
задан Hamas4 10 May 2013 в 16:12
поделиться