Можно ли отличать целое число с перечислением?
Возможный дубликат:
Вставить int в Enum в С#
Я получил следующее перечисление:
public enum detallistaDocumentStatus {
/// <remarks/>
ORIGINAL,
/// <remarks/>
COPY,
/// <remarks/>
REEMPLAZA,
/// <remarks/>
DELETE,
}
тогда я получил свойство класса типа detallistaDocumentStatus:
public detallistaDocumentStatus documentStatus {
get {
return this.documentStatusField;
}
set {
this.documentStatusField = value;
}
}
В реальной жизни пользователь отправит нам число (1, 2, 3 или 4), представляющее каждое значение перечисления в том порядке, в котором они объявлены.
Итак, можно ли это сделать так?
det.documentStatus = (detallistaDocumentStatus)3;
Если нет, как я могу получить значение перечисления с использованием целого числа в качестве индекса, мы используем много перечислений, поэтому мы хотим сделать что-то общее и многоразовое
Ответы
Ответ 1
Да, возможно отбрасывать Enum
в int
и наоборот, потому что каждый Enum
фактически представлен int
по умолчанию. Вы должны вручную указать значения элементов.
По умолчанию он начинается от 0 до N.
Также возможно отбрасывать Enum
до string
и наоборот.
public enum MyEnum
{
Value1 = 1,
Value2 = 2,
Value3 = 3
}
private static void Main(string[] args)
{
int enumAsInt = (int)MyEnum.Value2; //enumAsInt == 2
int myValueToCast = 3;
string myValueAsString = "Value1";
MyEnum myValueAsEnum = (MyEnum)myValueToCast; // Will be Value3
MyEnum myValueAsEnumFromString;
if (Enum.TryParse<MyEnum>(myValueAsString, out myValueAsEnumFromString))
{
// Put logic here
// myValueAsEnumFromString will be Value1
}
Console.ReadLine();
}
Ответ 2
Да, это возможно. Я использую следующие ENUM
public enum AccountTypes
{
Proposed = 1,
Open = 2
}
то, когда я его вызываю, я использую это, чтобы получить значение:
(int)AccountTypes.Open
И он вернет значение int, которое мне нужно, для указанного выше будет 2.
Ответ 3
Из спецификации С# 4.0:
1.10 Перечисления
Значения Enum могут быть преобразованы в целые значения и наоборот, используя типа. Например
int i = (int)Color.Blue; // int i = 2;
Color c = (Color)2; // Color c = Color.Blue;
Еще одна вещь, о которой нужно помнить, заключается в том, что вам разрешено использовать какое-либо целочисленное значение в диапазоне базового типа enum (по умолчанию это int), даже если это значение не сопоставляется с одним из имен в enum. От 1.10. Перечисления:
Набор значений, которые может принимать тип перечисления, не ограничен его перечислять членов. В частности, любое значение базового типа enum может быть перенесено в тип перечисления и является отдельным действительным значением этот тип перечисления.
Таким образом, в вашем примере разрешено также перечисление:
det.documentStatus = (detallistaDocumentStatus) 42;
даже если нет имени перечислимого типа, имеющего значение 42
.
Ответ 4
det.documentStatus = (detallistaDocumentStatus)3;
Вышеуказанное должно работать нормально. Единственное, что следует помнить здесь, это то, что вы назначаете определенные числа для перечисляющих членов, тогда что-то вроде этого может работать не так, как ожидалось. Кроме того, если вы явно не перечисляете свои значения перечисления, члены перечисления начинаются с индекса на основе нуля.
Таким образом, указанный выше код присваивает 4-му члену перечисления в порядке объявления.
Чтобы проверить, является ли данное целое число действительным значением перечисления для этого перечисления, используйте Enum.IsDefined
Ответ 5
Если вы даете явное целочисленное значение для ваших членов перечисления, например:
public enum Foo
{
Five=5
, Six
, Seven
, Eight
}
Вы можете просто передать их в int
, чтобы получить неявное значение.
var bar = (int)Foo.Six: /// bar == 6
Если вы явно не определяете значение, по крайней мере, первого, то приведение его к int даст вам порядок, в котором он появляется в объявлении.
Ответ 6
ENUM - это просто удобный способ назвать целые числа. Значения ENUM могут быть добавлены, вычтены и сравнены так же, как и int
.