web-dev-qa-db-fra.com

Est-il possible de convertir un entier en énumération?

J'ai obtenu l'énumération suivante:

 public enum detallistaDocumentStatus {

    /// <remarks/>
    ORIGINAL,

    /// <remarks/>
    COPY,

    /// <remarks/>
    REEMPLAZA,

    /// <remarks/>
    DELETE,
}

puis j'ai obtenu une propriété de classe de type detallistaDocumentStatus:

 public detallistaDocumentStatus documentStatus {
        get {
            return this.documentStatusField;
        }
        set {
            this.documentStatusField = value;
        }
    }

Dans la vie réelle, l'utilisateur nous enverra un nombre (1, 2, 3 ou 4) représentant chaque valeur d'énumération dans l'ordre où elles sont déclarées.

alors, est-il possible de lancer comme ça?

det.documentStatus = (detallistaDocumentStatus)3;

sinon, comment pourrais-je obtenir la valeur enum en utilisant un entier comme index, nous utilisons beaucoup d'énumérations, nous voulons donc faire quelque chose de générique et réutilisable

24
franko_camron

Oui, il est possible de convertir Enum en int et vice versa, car chaque Enum est en fait représenté par un int par défaut. Vous devez spécifier manuellement les valeurs des membres. Par défaut, il commence de 0 à N.

Il est également possible de convertir Enum en string et vice versa.

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();
}
48
ken2k

Oui c'est possible. J'utilise les ENUM suivants

public enum AccountTypes
{
  Proposed = 1,
  Open = 2
}

puis quand je l'appelle, j'utilise ceci pour obtenir la valeur:

(int)AccountTypes.Open

Et il renverra la valeur int dont j'ai besoin qui, pour ce qui précède, sera 2.

13
Taryn

De la spécification C # 4.0:

1.10 Énumérations

Les valeurs d'énumération peuvent être converties en valeurs intégrales et vice versa à l'aide de transtypages de type. Par exemple

int i = (int)Color.Blue;      // int i = 2;
Color c = (Color)2;               // Color c = Color.Blue;

Une autre chose à savoir est que vous êtes autorisé à transtyper n'importe quelle valeur intégrale dans la plage du type sous-jacent de l'énumération (par défaut, c'est int), même si cette valeur ne correspond pas à l'un des noms de la déclaration d'énumération. À partir de 1.10 Enums:

L'ensemble de valeurs qu'un type enum peut prendre n'est pas limité par ses membres enum. En particulier, toute valeur du type sous-jacent d'une énumération peut être convertie en type énumération et est une valeur valide distincte de ce type énumération.

Ainsi, ce qui suit est également autorisé avec l'énumération dans votre exemple:

det.documentStatus = (detallistaDocumentStatus) 42;

même si aucun nom d'énumération n'a la valeur 42.

12
Michael Burr
det.documentStatus = (detallistaDocumentStatus)3;

Ce qui précède devrait fonctionner correctement. La seule chose à retenir ici est que si vous attribuez des numéros spécifiques aux membres d'énumération, quelque chose comme cela peut ne pas fonctionner comme prévu. De plus, si vous ne numérotez pas explicitement vos valeurs d'énumération, les membres d'énumération commencent à un index basé sur zéro.

Ainsi, le code ci-dessus attribuerait le 4ème membre de l'énumération dans l'ordre de déclaration.

Pour vérifier si un entier donné est une valeur d'énumération valide pour cette énumération, utilisez Enum.IsDefined

1
IUnknown

Si vous donnez une valeur entière explicite à vos membres enum, comme ceci:

public enum Foo
{
    Five=5
    , Six
    , Seven
    , Eight
}

Vous pouvez simplement les convertir en int pour obtenir la valeur implicite.

var bar = (int)Foo.Six: /// bar == 6

Si vous ne définissez pas explicitement une valeur pour au moins la première, la convertir en un int vous donnera l'ordre dans lequel elle apparaît dans la déclaration.

1
3Dave