我有一个类型和一些派生类型。我想把这个派生类型的名称放在WPF的ComboBox控件中。这样做的正确方法是什么?目前我正在使用Assembly命名空间来获取这些类型的名称。
答案 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" />