Assembly.GetTypes()用于嵌套类

时间:2010-06-21 18:25:45

标签: c# reflection

Assmbly.GetTpes()获取程序集中的类型,但如果我还想要嵌套类(OrderLine),我该怎么做?我只知道程序集的名称,而不是类名,因此GetType(Order + OrderLine)不起作用。

public class Order
{
  public class OrderLine
  {
  }
}

3 个答案:

答案 0 :(得分:7)

我不知道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

的说法
  

返回的数组包含嵌套类型。

所以我的上述答案确实没有必要。您应该会Order找到Order+OrderLineAssembly.GetTypes作为类型返回的内容。

答案 1 :(得分:4)

这样的事情:


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

答案 2 :(得分:0)

您可以使用LINQ语句。我不是100%确定你要做什么,但你可以做这样的事情。

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

修改

如果正常Assembly.GetTypes()没有返回您的嵌套类,您可以迭代数组并将您在CurrentType.GetNestedTypes()中找到的所有内容添加到数组中。像

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