Подтвердить что ты не робот

Assembly.GetTypes() возвращает странные имена типов, например. "<> С"

При использовании Assembly.GetTypes() я получаю типы с Type.Name, начинающиеся с <>c.....

Я пытался использовать Google, если это анонимные типы или что-то еще. Но не может получить действительно хороший ответ.

Есть ли свойство Type, указывающее, что такое эти типы? Мне не нравится делать if(type.Name.StartsWith("<>"))

4b9b3361

Ответ 1

Это классы отображения, сгенерированные компилятором. Вы можете различать их, ища CompilerGeneratedAttribute:

var attr = Attribute.GetCustomAttribute(type, typeof(CompilerGeneratedAttribute));

Ответ 2

Они являются сгенерированными компилятором типами, которые будут включать анонимные типы, а также реализации IEnumerable<T>, IEnumerator<T>, IEnumerable и IEnumerator, которые создаются yield, и создаются структуры государственной машины на await.

Они будут иметь CompilerGeneratedAttribute.

Вы описываете имена как "странные", и они преднамеренно такие. Это все имена, которые являются действительными именами .NET, но не являются допустимыми в общих языках .NET, особенно С# и VB.NET. Это означает, что вы не можете создать такой класс с С# -кодированием напрямую, поэтому не нужно иметь никакой логики для проверки, что программист не создал соответствующий класс.

Ответ 3

Это класс компилятора с атрибутом атрибута

Различает генерируемый компилятором элемент из пользовательского элемент. Этот класс нельзя унаследовать.

Вы можете проверить его как

using System.Runtime.CompilerServices;


bool CompilerGen(Type t)
{
    var attr = Attribute.GetCustomAttribute(t, typeof(CompilerGeneratedAttribute));
    return attr != null;
}