【问题标题】:Assembly.GetTypes() for nested classes嵌套类的 Assembly.GetTypes()
【发布时间】:2013-01-31 05:06:46
【问题描述】:

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

public class Order
{
  public class OrderLine
  {
  }
}

【问题讨论】:

  • 只是好奇,您最终是在assembly.GetTypes() 中找到嵌套类型,还是仅通过调用type.GetNestedTypes() 才找到?

标签: c# reflection


【解决方案1】:

我不知道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 返回的类型。

【讨论】:

  • 这不会在嵌套类型中拾取嵌套类型。但说真的,这是谁做的?
  • @Stefan - 检测嵌套嵌套类型是留给读者的递归练习
【解决方案2】:

类似这样的:


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

【讨论】:

  • 哦,SelectMany。 赶往 MSDN 吸收信息
【解决方案3】:

您可以使用 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());
 }

【讨论】:

  • 嵌套类不一定是子类,子类也不一定是嵌套的。这不能满足提问者的要求。
  • @Greg 我只是在演示一个 LINQ 语句的示例。
猜你喜欢
  • 1970-01-01
  • 2011-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-23
  • 2019-03-12
相关资源
最近更新 更多