Получение всех типов в сборке userdefined
Я пытаюсь получить все типы, определенные в определенном пространстве имен userdefined
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
мой вопрос Почему я получаю эти дополнительные типы, которые не определены в этом пространстве имен?
Как выбрать тип, определенный пользователем?
кто-нибудь объяснит мне, что это такое и как они определяются в пространстве имен userdefined.
2 ответов
это все типы, созданные компилятором. Компилятор C# генерирует типы для реализации таких вещей, как:
- лямбда-выражения и анонимные методы
- итератор блоков
- async-методов
- анонимные типы
все они должны иметь CompilerGeneratedAttribute
применяется к ним, поэтому вы можете отфильтровать их таким образом, если хотите:
var types = Assembly.GetEntryAssembly()
.GetTypes()
.Where(t => t.Namespace == "namespace")
.Where(t => !t.GetTypeInfo().IsDefined(typeof(CompilerGeneratedAttribute), true));
они генерируются компилятором для замыканий.
этот вопрос объясняет почему они создаются: почему компилятор C# создает частный DisplayClass при использовании метода LINQ Any () и как его избежать?
Вы можете проверить для CompilerGeneratedAttribute
чтобы узнать, какие классы генерируются компилятором и удалить их из вашей коллекции:
Assembly.GetEntryAssembly().GetTypes()
.Where(t => t.Namespace == "namespace")
.Where(x => !x.GetTypeInfo().GetCustomAttributes<CompilerGeneratedAttribute>().Any());