Определите, является ли имя типа типом enum

У меня есть генератор кода, который анализирует спецификации xml классов и свойств, включая тип каждого свойства.

Свойства типа stringintbool просты в обработке.

Но если тип не является примитивным, то мне нужно определить, является ли это class или enum

Если бы у меня был экземпляр MyObject из MyType Я мог бы определить, если MyType был enum type с помощью:

if (MyType.IsEnum()) {}

но все, что у меня есть, это имя типа.

3 ответа

Пытаться

 instance.GetType().IsEnum

Или просто

myType.IsEnum;

UPD. Не заметил, что у вас есть только имя типа.

Type.GetType("my_type").IsEnum

Попробуйте Type.GetType, думайте, что он делает то, что вы ищете, или, по крайней мере, вернет объект Type, после чего вы можете вызвать.IsEnum

вам нужно будет использовать полное имя для вашего типа, например "MyNamespace.MyType", а не просто "MyType"

Использование Type.GetType("nameofEnum") метод

Из метода MSDN Type.GetType (строка)

Получает тип с указанным именем, выполняя поиск с учетом регистра

Чтобы это работало, вам нужно предоставить квалифицированное имя сборки типа enum

Завершенное сборкой имя типа для получения. Если тип находится в текущей выполняющейся сборке или в Mscorlib.dll, достаточно указать имя типа, соответствующее его пространству имен.

Type enumType = Type.GetType("AssemblyName.EnumName");
bool isEnum = enumType.IsEnum;

Так что, если ваш enum объявлен внутри некоторого пространства имен, вам нужно включить полный "путь"

namespace Project
{
    namespace MyAllEnums
    {
        public enum DesignPatterns
        {
            Spagetti = 0,
            Factory = 1
        }
    }
}

Тогда для получения типа используйте

Type enumType = Type.GetType("Project.MyAllEnums.DesignPatterns");
if (enumType.IsEnum)
{
    // ...
}

Если у вас нет информации об имени сборки типа enum, тогда другим подходом будет проверка всех имеющихся сборок и возврат первого типа с именем, которое вы пытаетесь найти.

Пример для текущей сборки

var assembly = Assembly.GetExecutingAssembly();
Type enumType = assembly.GetType("yourEnumType");

Как описано выше, вы получаете тип без имени, соответствующего сборке, но имейте в виду, что если ваш enum объявлен внутри внутреннего пространства имен, он не будет работать.

Другие вопросы по тегам