Создание экземпляра перечисления C # без значения 0 - PullRequest
4 голосов
/ 26 января 2011

Мне нужно создать экземпляр класса Enum, у которого нет значения 0. При значении 0 следующий код работает нормально:

ObjectFactory.CreateInstance("Edu3.DTOModel.Schedule.ScheduleStateEnum");

Enum:

namespace Edu3.DTOModel.Schedule
{
    public enum ScheduleStateEnum
    {
        DUMMY = 0,
        Draft = 1,
        Published = 2,
        Archived = 3
    }
}

Если я закомментирую DUMMY, создание экземпляра больше не будет работать.

Ответы [ 4 ]

6 голосов
/ 26 января 2011

Мне нужно создать экземпляр класса Enum, у которого нет значения 0.

Предположим, что перечисление выглядит так:

public enum ScheduleStateEnum
{
    Draft = 1,
    Published = 2,
    Archived = 3
}

youможно создать экземпляр следующим образом:

ScheduleStateEnum myState = 0;

Если вы не можете объявить переменную типа и вам нужен доступ к типу в виде строки (как в вашем примере), используйте Activator.CreateInstance:

var myState = Activator.CreateInstance(Type.GetType(
                  "Edu3.DTOModel.Schedule.ScheduleStateEnum"));

Конечно, обе эти опции дадут вам экземпляр, который на самом деле имеет целочисленное значение 0, даже если перечисление не объявляет его.Если вы хотите использовать по умолчанию одно из объявленных вами значений, вам нужно использовать Reflection, чтобы найти его, например:

var myState = Type.GetType("Edu3.DTOModel.Schedule.ScheduleStateEnum")
                  .GetFields(BindingFlags.Static | BindingFlags.Public)
                  .First()
                  .GetValue(null);

Это приведет к сбою для перечислений, у которых вообще не определены значения.Используйте FirstOrDefault и отметьте null, если хотите предотвратить это.

5 голосов
/ 26 января 2011

Это проблема с вашим классом ObjectFactory, потому что

Activator.CreateInstance(typeof(Edu3.DTOModel.Schedule.ScheduleStateEnum))

работает нормально и создает int 0.

2 голосов
/ 26 января 2011

На самом деле это невозможно.Enum по определению является полем значения, поэтому он должен иметь способ инициализировать его числовым значением 0.

1 голос
/ 26 января 2011

Рекомендуется указывать член enum с нулевым значением - подробности см. http://msdn.microsoft.com/en-us/library/ms182149%28VS.80%29.aspx.Есть ли причина, по которой вы не хотите иметь член с нулевым значением, например None?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...