我正在尝试获取在特定用户定义的命名空间
下定义的所有类型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
我的问题 为什么我得到这些未在该命名空间下定义的额外类型?
如何选择用户定义类型的类型?
有人解释了这些是什么以及如何在用户定义的命名空间中定义它们。
答案 0 :(得分:8)
这些是编译器生成的所有类型。 C#编译器生成类型以实现以下内容:
所有这些应该都应用了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());