Определите, является ли имя типа типом enum
У меня есть генератор кода, который анализирует спецификации xml классов и свойств, включая тип каждого свойства.
Свойства типа string
int
bool
просты в обработке.
Но если тип не является примитивным, то мне нужно определить, является ли это 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 объявлен внутри внутреннего пространства имен, он не будет работать.