web-dev-qa-db-fra.com

Conversion C # int en enum

Duplicata possible:
Cast int pour énumérer en C #

Si j'ai le code suivant:

enum foo : int
{
    option1 = 1,
    option2,
    ...
}

private foo convertIntToFoo(int value)
{
    // Convert int to respective Foo value or throw exception
}

À quoi ressemblerait le code de conversion?

53
TK.

C'est bien juste de lancer votre int sur Foo:

int i = 1;
Foo f = (Foo)i;

Si vous essayez de transtyper une valeur qui n'est pas définie, cela fonctionnera toujours. Le seul mal qui peut en résulter est la façon dont vous utiliserez la valeur ultérieurement.

Si vous voulez vraiment vous assurer que votre valeur est définie dans l'énumération, vous pouvez utiliser Enum.IsDefined:

int i = 1;
if (Enum.IsDefined(typeof(Foo), i))
{
    Foo f = (Foo)i;
}
else
{
   // Throw exception, etc.
}

Cependant, l'utilisation d'IsDefined coûte plus que le simple casting. Ce que vous utilisez dépend de votre mise en œuvre. Vous pouvez envisager de restreindre l'entrée utilisateur ou de gérer un cas par défaut lorsque vous utilisez l'énumération.

Notez également que vous n'avez pas besoin de spécifier que votre énumération hérite de int; Ceci est le comportement par défaut.

115
Jon B

Je suis sûr que vous pouvez faire un casting explicite ici.

foo f = (foo)value;

Tant que vous dites que l'énumération hérite (?) De int, que vous avez.

enum foo : int

[~ # ~] edit [~ # ~] Oui, il s'avère que par défaut, un type sous-jacent enums est int. Vous pouvez cependant utiliser n'importe quel type intégral sauf char.

Vous pouvez également convertir à partir d'une valeur qui n'est pas dans l'énumération, produisant une énumération non valide. Je soupçonne que cela fonctionne en changeant simplement le type de la référence et non en changeant réellement la valeur en mémoire.

enum (référence C #)
Types d'énumération (Guide de programmation C #)

16
Cameron MacFarland

Le casting devrait suffire. Si vous utilisez C # 3.0, vous pouvez créer une méthode d'extension pratique pour analyser les valeurs d'énumération:

public static TEnum ToEnum<TInput, TEnum>(this TInput value)
{
    Type type = typeof(TEnum);

    if (value == default(TInput))
    {
        throw new ArgumentException("Value is null or empty.", "value");
    }

    if (!type.IsEnum)
    {
        throw new ArgumentException("Enum expected.", "TEnum");
    }

    return (TEnum)Enum.Parse(type, value.ToString(), true);
}
5
weiran
if (Enum.IsDefined(typeof(foo), value))
{
   return (Foo)Enum.Parse(typeof(foo), value);
}

J'espère que cela t'aides

Edit Cette réponse a été votée comme valeur dans mon exemple est une chaîne, où comme la question posée pour un int. Mes applogies; ce qui suit devrait être un peu plus clair :-)

Type fooType = typeof(foo);

if (Enum.IsDefined(fooType , value.ToString()))
{
   return (Foo)Enum.Parse(fooType , value.ToString());
}
4
WestDiscGolf

Vous n'avez pas besoin de l'héritage. Tu peux faire:

(Foo)1 

ça va marcher ;)

2
Sergio