2010-06-21 63 views
6

Assmbly.GetTpes()獲取程序集中的類型,但如果我也想要嵌套類(OrderLine),我該怎麼做?我只知道程序集的名稱,而不是類名,所以GetType(Order + OrderLine)將不起作用。Assembly.GetTypes()嵌套類

public class Order 
{ 
    public class OrderLine 
    { 
    } 
} 
+0

只是好奇,你最終在'assembly.GetTypes()'中找到嵌套類型,還是隻通過調用'type.GetNestedTypes()'找到? – Greg 2010-06-22 05:29:30

回答

6

我不知道是否assembly.GetTypes()應該包括嵌套類。假設它沒有,像下面這樣的方法可以遍歷所有程序集的類型。

IEnumerable<Type> AllTypes(Assembly assembly) 
{ 
    foreach (Type type in assembly.GetTypes()) 
    { 
     yield return type;   
     foreach (Type nestedType in type.GetNestedTypes()) 
     { 
      yield return nestedType; 
     } 
    } 
} 

編輯:
MSDN has the following說一下Assembly.GetTypes

返回的陣列包括嵌套類型。

所以真的我上面的答案不應該是必要的。您應該找到OrderOrder+OrderLine作爲Assembly.GetTypes類型返回。

+0

這不會在嵌套類型中選擇嵌套類型。但是,真的,這是誰? – 2010-06-21 18:45:49

+2

@Stefan - 檢測嵌套嵌套嵌套類型是一個遞歸練習,留給讀者 – Greg 2010-06-21 18:51:29

0

您可以使用LINQ語句。我不是100%確定你想要做什麼,但你可以做這樣的事情。

Assembly.GetTypes().Where(type => type.IsSubclassOf(SomeType) && type.Whatever); 

編輯

如果正常Assembly.GetTypes()沒有返回您的嵌套類,你可以迭代這個數組,並添加你找到數組的一切。像

var allTypes = new List<Type>(); 
var types = Assembly.GetTypes(); 
allTypes.AddRange(types); 
foreach(var type in types) 
{ 
    allTypes.AddRange(type.GetNestedTypes()); 
} 
+2

嵌套類不一定是子類,子類不一定是嵌套的。這不符合提問者的要求。 – Greg 2010-06-21 18:28:22

+0

@Greg我只是演示了一個LINQ語句的例子。 – 2010-06-21 18:33:04

4

事情是這樣的:


Assembly.GetTypes().SelectMany(t => new [] { t }.Concat(t.GetNestedTypes()));
+1

哦,SelectMany。 *趕往MSDN吸收信息* – 2010-06-21 18:36:35