2014-10-05 206 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); 

這隻會在其中包含源型