230 votes

Le choix de la valeur par défaut d'un type Enum, sans avoir à modifier les valeurs

En C#, il est possible de décorer un type Enum avec un attribut ou de faire autre chose pour spécifier la valeur par défaut devrait être, sans avoir à modifier les valeurs? Les chiffres pourraient être fixés dans la pierre pour quelque raison que ce soit, et ce serait pratique pour toujours avoir le contrôle sur la valeur par défaut.

enum Orientation
{
    None = -1,
    North = 0,
    East = 1,
    South = 2,
    West = 3
}

Orientation o; // Is 'North' by default.

384voto

James Curran Points 55356

La valeur par défaut pour un enum (en fait, tout type de valeur) est 0 -- même si ce n'est pas une valeur valide pour qui enum. Il ne peut pas être changé.

49voto

David Points 467

Si le zéro n'a pas la bonne valeur par défaut, vous pouvez utiliser le modèle de composant pour définir l'enum:

[DefaultValue(None)]
public enum Orientation
{
     None = -1,
     North = 0,
     East = 1,
     South = 2,
     West = 3
 }

public static class Utilities
{
    public static TEnum GetDefaultValue<TEnum>() where TEnum : struct
    {
        Type t = typeof(TEnum);
        DefaultValueAttribute[] attributes = (DefaultValueAttribute[])t.GetCustomAttributes(typeof(DefaultValueAttribute), false);
        if (attributes != null &&
            attributes.Length > 0)
        {
            return (TEnum)attributes[0].Value;
        }
        else
        {
            return default(TEnum);
        }
    }
}

et puis, vous pouvez appeler:

Orientation o = Utilities.GetDefaultValue<Orientation>();
System.Diagnostics.Debug.Print(o.ToString());

Remarque: vous aurez besoin d'inclure la ligne suivante au début du fichier:

using System.ComponentModel;

17voto

Joe Points 17829

Un enum est par défaut quel que soit l'énumération équivaut à zéro. Je ne crois pas que cela est modifiable par attribut ou d'autres moyens.

(MSDN dit: "La valeur par défaut d'un enum E est la valeur produite par l'expression (E)0.")

11voto

Avram Points 3044

Vous ne pouvez pas, mais si vous voulez, vous pouvez faire quelques truc. :)

    public struct Orientation
    {
        ...
        public static Orientation None = -1;
        public static Orientation North = 0;
        public static Orientation East = 1;
        public static Orientation South = 2;
        public static Orientation West = 3;
    }

l'utilisation de cette structure en tant que simple enum.
où vous pouvez créer des p.a == Orientation.Est (ou toute valeur que vous voulez) par défaut
pour utiliser le truc lui-même, vous devez le convertir en int par le code.
il y a la mise en œuvre:

        #region ConvertingToEnum
        private int val;
        static Dictionary<int, string> dict = null;

        public Orientation(int val)
        {
            this.val = val;
        }

        public static implicit operator Orientation(int value)
        {
            return new Orientation(value - 1);
        }

        public static bool operator ==(Orientation a, Orientation b)
        {
            return a.val == b.val;
        }

        public static bool operator !=(Orientation a, Orientation b)
        {
            return a.val != b.val;
        }

        public override string ToString()
        {
            if (dict == null)
                InitializeDict();
            if (dict.ContainsKey(val))
                return dict[val];
            return val.ToString();
        }

        private void InitializeDict()
        {
            dict = new Dictionary<int, string>();
            foreach (var fields in GetType().GetFields(BindingFlags.Public | BindingFlags.Static))
            {
                dict.Add(((Orientation)fields.GetValue(null)).val, fields.Name);
            }
        } 
        #endregion

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X