Перечисление.ToObject с «недопустимым» значением int — как это исправить

#c# #enums

#c# #перечисления

Вопрос:

Я пытаюсь преобразовать объект в перечисление, которое я получаю с помощью отражения, и у меня есть только информация о его типе.

Вот мое перечисление:

 public enum Foo : int
{
    Apple = 1,
    Banana = 2,
    Orange = 3,
}
  

Теперь в моем методе я пытаюсь установить значение объекта, с помощью перечисления информация, которая у меня есть, — это type info и «исходное» значение, которое является int.

 public class Bar
{
    public Bar()
    {
        var enumValue = GetEnumValue(typeof(Foo), 0);
    }

    public object GetEnumValue(Type enumType, object value)
    {
        return Enum.ToObject(enumType, value);
    }
}
  

Этот код работает до сих пор, но есть «небольшая» проблема, возможно, вы заметили, что я объявляю фиксированные значения для моего Foo Enum (Apple = 1, Banana = 2, Orange = 3) , а в моем GetEnumValue(typeof(Foo), 0) моем втором параметре — 0.

0 не является значением, указанным в моем перечислении, Enum.ToObject() не генерирует исключение или что-либо еще, это только работает.

Я хотел бы исправить это так, чтобы, если GetEnumValue вызывается с недопустимым значением, возвращаемое значение должно быть значением перечисления по умолчанию.

Значение перечисления по умолчанию должно быть для обнуляемого перечисления null и для ненулевого первого перечисления, поэтому в моем случае Apple.

Ответ №1:

Вместо конструктора вы должны поместить это:

         public Bar(int value)
        {
            if (Enum.IsDefined(typeof(Foo), value))
            {
                var enumValue = GetEnumValue(typeof(Foo), value);
            }
            else
            {
                var enumValue = GetEnumValue(typeof(Foo), 1);

                //or like this...
                var enumValue1 = Enum.GetValues(typeof(Foo)).GetValue(0);
            }
        }
  

Я оставил это очень явным, чтобы вы поняли, что происходит.