2014-10-05 3 views
0

У меня есть тип и некоторые производные типы. Я хочу поместить имена этих производных типов в элемент управления ComboBox в WPF. Каков правильный способ сделать это? В настоящее время я использую пространство имен Assembly для получения имен этих типов.Перечисление производных типов

+0

Вы должны использовать 'Relections' сделать это. Do 'Type superClass = myClass.GetType(). BaseType', чтобы получить имя базового класса при перечислении в списке типов. если их имя базового класса совпадает с именем, которым вы занимаетесь, тогда получите их имена! очень легко – Transcendent

+0

@KingKing: Отметьте обновленный комментарий – Transcendent

+0

@KingKing: 'Reflection' - пространство имен, и то, что он делает, - это прокрасться в типы. Таким образом, любая операция, аналогичная, хотя и может быть выполнена без использования этого пространства имен, будет технически известна как отражение. У нас также есть это в Java – Transcendent

ответ

4

Первый шаг, чтобы получить 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'sName.

public List<Type> Types {get;set;} 
public Type SelectedType {get;set;} 


<ComboBox ItemsSource="{Binding Types}" 
      SelectedItem="{Binding SelectedType}" 
      DisplayMemberPath="Name" /> 
+0

И в отношении интерфейсов - если OP не хочет интерфейсов и их реализаций, это простое исправление, чтобы отфильтровать его, но на данный момент нет причин помешать этому коду. –

4

Вы можете использовать отражение, чтобы сделать это:

var type = typeof(SomeType); 
IEnumerable<string> exporters = type.Assembly 
    .GetTypes() 
    .Where(t => t.IsSubclassOf(type)) 
    .Select(t => t.Name); 

Это будет искать типов только в сборке, которая содержит тип источника

Смежные вопросы