#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);
}
}
Я оставил это очень явным, чтобы вы поняли, что происходит.