有没有一种方法可以在C#中获取内部类列表?

36
根据标题,我想要一个给定类的所有内部类的列表,可以是名称列表或类型列表 - 我并不关心。这是否可能?我认为可以使用反射方式实现,但我还没有找到合适的方法。

4
使用“内部类”这个短语表明你可能有Java经验。值得指出的是,在C#中,它们被称为“嵌套类”,并且它们更接近于Java的“静态嵌套类”而不是Java的“内部类”。 - Kevin Cathcart
5个回答

53

您需要使用Type.GetNestedTypes。这将返回类型列表,然后您可以查询它们的名称。


就像 type.GetTypeInfo().DeclaredNestedTypes - ErikE

12

你需要的功能不是 Type.GetNestedTypes 吗?

请注意,如果你想获取 "双重嵌套" 的类型,你需要递归 - 因为 Foo.Bar.Baz 是在 Foo.Bar 中的一个嵌套类型,而不是在 Foo 中。

对于 "现代" 环境(.NET 4.5、PCLs、UWA 等),你需要使用 TypeInfo.DeclaredNestedTypes,例如 type.GetTypeInfo().DeclaredNestedTypes,并使用 GetTypeInfo() 扩展方法


在Windows 8.1中似乎没有“GetNestedTypes”方法。有什么建议吗?谢谢。 - superpuccio
1
@superpuccio:在现代反射中,许多事情都需要使用“TypeInfo” - 在这种情况下,需要使用“TypeInfo.DeclaredNestedTypes”。 - Jon Skeet
就像 typeof(T).GetTypeInfo().DeclaredNestedTypes - ErikE
@ErikE:已经澄清。 - Jon Skeet

7

Type.GetNestedTypes()方法将返回指定类型的公共嵌套类型。

如果您还想获取私有和内部嵌套类型,必须像这样调用Type.GetNestedTypes(BindingFlags bindingFlags)方法:

Type[] nestedTypes = typeof(MyType).GetNestedTypes(BindingFlags.Static |
                                                   BindingFlags.Instance |
                                                   BindingFlags.Public |
                                                   BindingFlags.NonPublic);

4
Type[] nested = typeof(SomeClass).GetNestedTypes();

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接