У меня есть тип и некоторые производные типы. Я хочу поместить имена этих производных типов в элемент управления ComboBox в WPF. Каков правильный способ сделать это? В настоящее время я использую пространство имен Assembly для получения имен этих типов.Перечисление производных типов
ответ
Первый шаг, чтобы получить Type
объект для каждого из ваших производных типов. Ответ Павла дает вам хорошую основу для этого, хотя его решение дает только прямые подтипы, а не типы дальше по цепочке наследования, и только типы, определенные в той же сборке, что и базовый тип. Вот небольшая обновленная версия:
var baseType = typeof(Base);
var currentlyLoadedAssemblies = AppDomain.Current.GetAssemblies();
var relevantTypes = currentlyLoadedAssemblies
.SelectMany (assembly => assembly.GetTypes())
.Where(type => baseType.IsAssignableFrom(type));
Types = relevantTypes.ToList();
Нет, у нас есть все типы, мы можем привязать их к combobox WPF. Вместо того, чтобы извлекать строки из имен типов, мы привязаемся к самому объекту Type
, поэтому, когда пользователь его выбирает, мы будем иметь выбранный объект типа ready. Мы сообщим ComboBox отобразить свойство Type's
Name
.
public List<Type> Types {get;set;}
public Type SelectedType {get;set;}
<ComboBox ItemsSource="{Binding Types}"
SelectedItem="{Binding SelectedType}"
DisplayMemberPath="Name" />
И в отношении интерфейсов - если OP не хочет интерфейсов и их реализаций, это простое исправление, чтобы отфильтровать его, но на данный момент нет причин помешать этому коду. –
Вы можете использовать отражение, чтобы сделать это:
var type = typeof(SomeType);
IEnumerable<string> exporters = type.Assembly
.GetTypes()
.Where(t => t.IsSubclassOf(type))
.Select(t => t.Name);
Это будет искать типов только в сборке, которая содержит тип источника
- 1. Карта нескольких производных типов
- 2. Десериализация производных типов
- 3. JSON десериализация производных типов
- 4. Проблема сериализации Nservicebus производных типов
- 5. Перечисление производных классов в исполняемом файле C++
- 6. Генерический оператор switch для инициализации производных типов
- 7. Перечисление типов ввода css shortcut
- 8. C# Явное перечисление литья типов
- 9. Управление набора векторов шаблонных производных типов
- 10. Использование асинхронного атрибута в производных типов
- 11. WinForms дизайнерские свойства различных производных типов
- 12. C++ Ссылка на вектор производных типов
- 13. размещаемых массивов как часть производных типов
- 14. Обнаружение производных типов с использованием отражения
- 15. Сериализация производных типов - не в массиве
- 16. реализация абстрактного класса с использованием производных типов
- 17. Чистые абстрактные классы и экземпляры производных типов
- 18. `` Activator.CreateInstance` и new` свойства в производных типов
- 19. Ускорить сериализацию всех производных типов динамически
- 20. Ошибки Fortran при использовании производных типов
- 21. Выполнение атрибута AttributeUsage для производных типов атрибутов
- 22. Прием сообщений для производных типов в MVVMLight
- 23. Перечисление всех комбинаций списков разных типов
- 24. IDL перечисление не отображается в библиотеке типов
- 25. Cast словари к типу - перечисление типов данных
- 26. Перечисление для пользовательских типов в GO
- 27. Как сделать кортеж на основе некоторых производных типов?
- 28. Идентификация производных типов из списка объектов базового класса
- 29. Хорошая практика в именах производных типов в fortran
- 30. Как предотвратить ODataConventionModelBuilder для автоматического отображения метаданных всех производных типов?
Вы должны использовать 'Relections' сделать это. Do 'Type superClass = myClass.GetType(). BaseType', чтобы получить имя базового класса при перечислении в списке типов. если их имя базового класса совпадает с именем, которым вы занимаетесь, тогда получите их имена! очень легко – Transcendent
@KingKing: Отметьте обновленный комментарий – Transcendent
@KingKing: 'Reflection' - пространство имен, и то, что он делает, - это прокрасться в типы. Таким образом, любая операция, аналогичная, хотя и может быть выполнена без использования этого пространства имен, будет технически известна как отражение. У нас также есть это в Java – Transcendent