Получение всех типов в сборке 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());