2012-02-09 59 views
2

我有一個包含有一個共同的祖先類(在組件內定義的類型的組件。該共同的祖先是在大多數情況下類的直接基類型。使用.NET反射找到一個共同的祖先類

我需要能夠從此程序集中的所有類型中篩選出具有此共同祖先的類型。出於各種原因,我不能實例化類型(它們不作爲規則具有共同的構造函數簽名),所以我有從myAssembly.GetTypes()開始,並檢查類型本身的屬性,換句話說,我必須使用類,而不是類的實例

如何檢查此集合中的每個類型以查找它是否從所需的共同祖先繼承?

後來:不用擔心,我現在擁有它。訣竅是實例化一個類型的對象,它是從組件祖先類型,如

Type ancestor = assy.getType("myAncestorClassName", true, true); 
Type[] interestingClasses = assy.GetTYypes().Where(t => t.IsSubclassOf(ancestor)); 

然而,這是行不通的:

Type[] interestingClasses = assy.GetTYypes().Where(t => t.IsSubclassOf(typeof(AncestorClass))); 

,因爲,我認爲,祖先類型定義在另一個組件中,而不是在主組件中。

很多很久以後....感謝所有爲此提供答案的人。我一直在轉向別的東西,但我現在有一個很好的解決方案(並且學到了新的東西)。

+0

你只是建立一個通過它們的直接BaseType連接的類型的樹,它本身是一個類型...在根上只有一個節點 - 它是所有類型的'對象',並且一切都繼承... – Yahia 2012-02-09 12:42:33

回答

4

對於集合中的每種類型,可以使用Type.IsAssignableFrom來查看它們是否源自此祖先。

例如:

var types = assembly.GetTypes().Exclude(t => typeof(CommonAncestor).IsAssignableFrom(t)); 

這應該讓所有類型的未從CommonAncestor衍生組裝。

+0

謝謝 - 我忽略的問題是,所討論的類型必須從裝入的程序集中「提取」。我直接引用它(來自引用的程序集)並且不起作用。 – haughtonomous 2012-02-09 13:09:01

+0

它應該仍然可以工作,因爲'typeof(AncestorClass)'將是來自它的任何組件的類型。你確定你從正確的程序集中使用了正確的'AncestorClass'定義嗎? – Lukazoid 2012-02-09 13:38:06

1

假設你正在使用C#

Type[] types = myAssenbly.GetTypes(); 

foreach(Type t in types) 
{ 
    // Is a Common Ancestor subclass 
    bool isString = t.IsAssignableFrom(typeof(CommonAncestor)); 
} 
1

看看這個片斷:

var commonAncestor = typeof(object); 
var descendants = 
    Assembly.GetExecutingAssembly().GetTypes().Where(
    type => commonAncestor.IsAssignableFrom(type)); 

這將獲取在從object後裔當前裝配的所有類型。當然,用你自己的共同祖先類型替換它。如果

Type.IsAssignableFrom()方法檢查,你可以這樣做:

MyType b = new MyType(); 
object a = b; 

沒有錯誤。

相關問題