2013-06-04 19 views
0

我可以找出所有的BaseClass的子類的東西,如給定一個基類,我如何找到它的最特殊的子類?

var subclasses = Assembly 
    .GetAssembly(typeof(BaseClass)) 
    .GetTypes() 
    .Where(t => t.IsSubclassOf(typeof(BaseClass))) 

現在的班,我怎麼只選擇最專業的子類?也就是說,葉節點是沒有自己的子類的節點。

+0

不,至少尚未。 – shamp00

回答

1
subclasses.Where(c => !subclasses.Any(c2 => c == c2.BaseType)) 

這樣做會更快,你做一個HashSet的BaseTypes。

這隻適用於因爲BaseClass是在同一個程序集中;否則,它會不正確地捕獲繼承自不同程序集中的中間類的中間類。
更一般的解決方案是檢查IsAssignableFrom針對每個其他的子類。

+1

請注意,由於延遲執行,對於每個類型,您將迭代程序集中的所有類型,並過濾基類型的子類。這使得它首先將「子類」粘貼到集合中非常重要。正如你所說,'HashSet'將是首選。 – Servy

+0

@Servy:非常好的一點。如果你不想使用HashSet,使用'.ToList()'和'RemoveAll()'。 – SLaks

+0

這將返回第一級子類。如果C1和C2是B的子類,它是A的一個子類,我需要C1和C2。您的答案返回B. – shamp00

相關問題