Ответ 1
Это классы отображения, сгенерированные компилятором. Вы можете различать их, ища CompilerGeneratedAttribute
:
var attr = Attribute.GetCustomAttribute(type, typeof(CompilerGeneratedAttribute));
При использовании Assembly.GetTypes()
я получаю типы с Type.Name
, начинающиеся с <>c....
.
Я пытался использовать Google, если это анонимные типы или что-то еще. Но не может получить действительно хороший ответ.
Есть ли свойство Type, указывающее, что такое эти типы? Мне не нравится делать if(type.Name.StartsWith("<>"))
Это классы отображения, сгенерированные компилятором. Вы можете различать их, ища CompilerGeneratedAttribute
:
var attr = Attribute.GetCustomAttribute(type, typeof(CompilerGeneratedAttribute));
Они являются сгенерированными компилятором типами, которые будут включать анонимные типы, а также реализации IEnumerable<T>
, IEnumerator<T>
, IEnumerable
и IEnumerator
, которые создаются yield
, и создаются структуры государственной машины на await
.
Они будут иметь CompilerGeneratedAttribute
.
Вы описываете имена как "странные", и они преднамеренно такие. Это все имена, которые являются действительными именами .NET, но не являются допустимыми в общих языках .NET, особенно С# и VB.NET. Это означает, что вы не можете создать такой класс с С# -кодированием напрямую, поэтому не нужно иметь никакой логики для проверки, что программист не создал соответствующий класс.
Это класс компилятора с атрибутом атрибута
Различает генерируемый компилятором элемент из пользовательского элемент. Этот класс нельзя унаследовать.
Вы можете проверить его как
using System.Runtime.CompilerServices;
bool CompilerGen(Type t)
{
var attr = Attribute.GetCustomAttribute(t, typeof(CompilerGeneratedAttribute));
return attr != null;
}