枚举派生类型

时间:2014-10-05 19:42:30

标签: c# wpf inheritance

我有一个类型和一些派生类型。我想把这个派生类型的名称放在WPF的ComboBox控件中。这样做的正确方法是什么?目前我正在使用Assembly命名空间来获取这些类型的名称。

2 个答案:

答案 0 :(得分:4)

您可以使用反射来执行此操作:

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

这将仅在包含源类型

的程序集中搜索类型

答案 1 :(得分:4)

第一步是为每个派生类型获取一个Type对象。 Pavel的回答为你提供了一个很好的基础,尽管他的解决方案只提供了直接的子类型,而不是继承链中的类型,只有在与基类型相同的程序集中定义的类型。这是一个稍微更新的版本:

var baseType = typeof(Base);
var currentlyLoadedAssemblies = AppDomain.Current.GetAssemblies();
var relevantTypes = currentlyLoadedAssemblies
       .SelectMany (assembly => assembly.GetTypes())
       .Where(type => baseType.IsAssignableFrom(type));
Types = relevantTypes.ToList();

我们没有所有类型,我们可以将它们绑定到WPF组合框。我们不是从类型名称中提取字符串,而是绑定到Type对象本身,因此当用户选择一个时,我们将准备好所选的Type对象。我们告诉ComboBox显示Type's Name属性。

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


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