2014-10-05 127 views
0

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

+0

你必须使用'Relections'做到这一点。在枚举类型列表时,输入superClass = myClass.GetType()。BaseType'来获取基类名。如果他们的基类名称与您的基类名称相匹配,那么就得到他们的名字!非常容易 – Transcendent 2014-10-05 19:49:23

+0

@KingKing:查看更新的评论 – Transcendent 2014-10-05 19:53:03

+0

@KingKing:'Reflection'是一个命名空间,它的功能是潜入类型。因此,任何类似的操作即使可以在不使用该名称空间的情况下完成,在技术上也称为反射。我们也在Java中使用它 – Transcendent 2014-10-05 19:56:51

回答

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'sName属性。

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


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

关于接口 - 如果OP不需要接口和它们的实现,它是一个简单的修复过滤器,但是现在没有理由将它与代码混淆。 – 2014-10-05 20:31:01

4

您可以使用反射来做到这一点:

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

这只会在其中包含源型