在用户定义的程序集下获取所有类型

时间:2017-03-28 11:21:24

标签: c# reflection .net-core system.reflection

我正在尝试获取在特定用户定义的命名空间

下定义的所有类型
Assembly.GetEntryAssembly().GetTypes().Where(t => t.Namespace == "namespace")


    <>c__DisplayClass3_0    
    <>c__DisplayClass4_0    
    <>c__DisplayClass6_0    
    <>c__DisplayClass2_0    
    <>c__DisplayClass2_1    
    <>c__DisplayClass2_2    
    <>c__DisplayClass2_3    
    <>c__DisplayClass2_4    
    <>c__DisplayClass2_5    
    <>c__DisplayClass2_6    
    <>c__DisplayClass2_7    
    <>c__DisplayClass2_8

我的问题 为什么我得到这些未在该命名空间下定义的额外类型?

如何选择用户定义类型的类型?

有人解释了这些是什么以及如何在用户定义的命名空间中定义它们。

2 个答案:

答案 0 :(得分:8)

这些是编译器生成的所有类型。 C#编译器生成类型以实现以下内容:

  • Lambda表达式和匿名方法
  • Iterator blocks
  • 异步方法
  • 匿名类型

所有这些应该都应用了CompilerGeneratedAttribute,因此您可以根据需要将其过滤掉:

var types = Assembly.GetEntryAssembly()
    .GetTypes()
    .Where(t => t.Namespace == "namespace")
    .Where(t => !t.GetTypeInfo().IsDefined(typeof(CompilerGeneratedAttribute), true));

答案 1 :(得分:4)

这些是由编译器为闭包生成的。

此问题解释了为什么创建了它们:Why does C# compiler create private DisplayClass when using LINQ method Any() and how can I avoid it?

您可以检查CompilerGeneratedAttribute以了解编译器生成的类,并将其从您的集合中删除:

Assembly.GetEntryAssembly().GetTypes()
   .Where(t => t.Namespace == "namespace")
   .Where(x => !x.GetTypeInfo().GetCustomAttributes<CompilerGeneratedAttribute>().Any());