Динамические объекты .NET с отражением - PullRequest
1 голос
/ 10 октября 2008

Как определить, действительно ли Nullable(of Enum) является Enum с помощью отражения?

Я работаю с методом, который динамически заполняет объект типа T с IDataReader, полученным из вызова базы данных. По своей сути он проходит по ординалам устройства чтения данных и всем свойствам T и заполняет свойства, соответствующие имени ординалов (также для изменения имен столбцов создается некоторая магия атрибутов). При любых других обстоятельствах он работает отлично, но когда я проверяю свойство BaseType для System.Enum, я нахожу вместо него System.ValueType Таким образом, моя проверка Enum завершается неудачно, и метод взрывается.

[Изменить: Type.IsEnum не работает, как мне это нужно. Основная проблема здесь в том, что ничто в иерархии BaseType T не говорит о том, что это Enum. Как будто создание этого типа Nullable лишает меня Enum прав.]

Есть идеи?

Ответы [ 4 ]

7 голосов
/ 10 октября 2008

Это немного громоздко:

  • Получить тип от PropertyInfo.PropertyType
  • Тест на IsGenericType
  • Если это так, получить универсальный тип с помощью GetGenericTypeDefinition()
  • Если этот тип равен typeof(Nullable<>), у вас есть Nullable
  • Получить базовый (т. Е. Enum) тип с помощью Nullable.GetUnderlyingType(propertyInfo.PropertyType)
0 голосов
/ 01 мая 2009

Я тоже чувствую, что вопрос не совсем ясен. Я использовал трюк OregonGhost в нашем производственном коде. Хорошо, когда список Enums небольшой, но может становиться медленным по мере роста иерархии (прочитайте больше 100 записей).

Мне также нравится использовать цепочку значений Enum, когда существует концепция, охватывающая несколько классов в иерархии наследования (например, перечисления, представляющие поля / свойства в классе):

class Base
{
  enum BaseEnum
  {
   Val1,
   Val2,
   LastVal
  }
}

class Derived
{
  enum DerivedEnum
  {
    Val3 = BaseEnum.LastVal,
    Val4,
    LastVal
  }
}
0 голосов
/ 10 октября 2008

Всегда ли столбец, возвращаемый из IDataReader, может иметь значение Nullable? Если это так, простой способ проверки может быть:

AnEnum? enumObj;
if (enumObj.HasValue)
{
  enumObj.Value.GetType().IsEnum();
}

Надеюсь, это поможет.

0 голосов
/ 10 октября 2008

Ваш вопрос неясен. Вы можете использовать .HasValue, чтобы определить, есть ли у Nullable Enum или он нулевой, но это не является целью вашего вопроса. Используете ли вы отражение, чтобы получить тип переменной и преобразовывает данные IDataReader из Object в этот тип?

...