web-dev-qa-db-fra.com

Choisir la valeur par défaut d'un type Enum sans avoir à changer de valeur

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

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

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

La valeur par défaut pour un enum (en fait, tout type de valeur) est 0, même s'il ne s'agit pas d'une valeur valide pour ce enum. Cela ne peut pas être changé.

325
James Curran

La valeur par défaut de n'importe quelle énumération est zéro. Donc, si vous voulez définir un énumérateur comme valeur par défaut, définissez-le sur zéro et tous les autres énumérateurs sur une valeur différente de zéro (le premier énumérateur ayant la valeur zéro sera la valeur par défaut de cette énumération s'il existe plusieurs énumérateurs avec la valeur zéro).

enum Orientation
{
    None = 0, //default value since it has the value '0'
    North = 1,
    East = 2,
    South = 3,
    West = 4
}

Orientation o; // initialized to 'None'

Si vos énumérateurs n'ont pas besoin de valeurs explicites, assurez-vous simplement que le premier énumérateur est celui que vous souhaitez utiliser comme énumérateur par défaut, car "Par défaut, le premier énumérateur a la valeur 0 et la valeur de chaque énumérateur successif est augmentée de 1." ( référence C # )

enum Orientation
{
    None, //default value since it is the first enumerator
    North,
    East,
    South,
    West
}

Orientation o; // initialized to 'None'
62
user65199

Si zéro ne fonctionne pas comme valeur par défaut appropriée, vous pouvez utiliser le modèle de composant pour définir une solution de contournement pour l'énumération:

[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 ensuite vous pouvez appeler:

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

Remarque: vous devrez inclure la ligne suivante en haut du fichier:

using System.ComponentModel;

Cela ne modifie pas la valeur par défaut de l'énum en langage C #, mais donne un moyen d'indiquer (et d'obtenir) la valeur par défaut souhaitée.

35
David

La valeur par défaut d'une énumération correspond à l'énumération égale à zéro. Je ne crois pas que cela puisse changer par attribut ou par d’autres moyens.

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

17
Joe

Vous ne pouvez pas, mais si vous voulez, vous pouvez faire un tour. :)

    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;
    }

utilisation de cette structure comme simple énumération.
où vous pouvez créer p.a == Orientation.East (ou toute autre valeur de votre choix) par défaut
Pour utiliser le truc lui-même, vous devez convertir int par code.
la mise en oeuvre:

        #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
10
Avram

Une autre façon qui pourrait être utile - d'utiliser une sorte de "pseudonyme". Par exemple:

public enum Status
{
    New = 10,
    Old = 20,
    Actual = 30,

    // Use Status.Default to specify default status in your code. 
    Default = New 
}
8
Dmitry Pavlov

En réalité, la valeur par défaut de enum est le premier élément du enum dont la valeur est 0.

Donc par exemple:

public enum Animals
{
    Cat,
    Dog,
    Pony = 0,
}
//its value will actually be Cat not Pony unless you assign a non zero value to Cat.
Animals animal;
6
Cian

The default value of enum is the enummember equal to 0 or the first element(if value is not specified) ... Mais j'ai rencontré des problèmes critiques en utilisant enum dans mes projets et j'ai surmonté mes problèmes en faisant quelque chose en dessous ... Mon besoin était toujours lié au niveau de la classe ...

    class CDDtype
    {
        public int Id { get; set; }
        public DDType DDType { get; set; }

        public CDDtype()
        {
            DDType = DDType.None;
        }
    }    


    [DefaultValue(None)]
    public enum DDType
    {       
        None = -1,       
        ON = 0,       
        FC = 1,       
        NC = 2,       
        CC = 3
    }

et obtenir le résultat attendu

    CDDtype d1= new CDDtype();
    CDDtype d2 = new CDDtype { Id = 50 };

    Console.Write(d1.DDType);//None
    Console.Write(d2.DDType);//None

Maintenant que se passe-t-il si la valeur provient de DB .... Ok dans ce scénario ... transmettez la valeur dans la fonction ci-dessous et il convertira la valeur en enum ... la fonction ci-dessous gèrera divers scénarios et sera générique .. et croyez moi c'est très rapide ..... :)

    public static T ToEnum<T>(this object value)
    {
        //Checking value is null or DBNull
        if (!value.IsNull())
        {
            return (T)Enum.Parse(typeof(T), value.ToStringX());
        }

        //Returanable object
        object ValueToReturn = null;

        //First checking whether any 'DefaultValueAttribute' is present or not
        var DefaultAtt = (from a in typeof(T).CustomAttributes
                          where a.AttributeType == typeof(DefaultValueAttribute)
                          select a).FirstOrNull();

        //If DefaultAttributeValue is present
        if ((!DefaultAtt.IsNull()) && (DefaultAtt.ConstructorArguments.Count == 1))
        {
            ValueToReturn = DefaultAtt.ConstructorArguments[0].Value;
        }

        //If still no value found
        if (ValueToReturn.IsNull())
        {
            //Trying to get the very first property of that enum
            Array Values = Enum.GetValues(typeof(T));

            //getting very first member of this enum
            if (Values.Length > 0)
            {
                ValueToReturn = Values.GetValue(0);
            }
        }

        //If any result found
        if (!ValueToReturn.IsNull())
        {
            return (T)Enum.Parse(typeof(T), ValueToReturn.ToStringX());
        }

        return default(T);
    }
4
Moumit

La valeur par défaut pour un type d’énumération est 0:

  • " Par défaut, le premier énumérateur a la valeur 0 et la valeur de chaque énumérateur successif est augmentée de 1. "

  • " Le type de valeur enum a la valeur produite par l'expression (E) 0, où E est l'identificateur enum. "

Vous pouvez consulter la documentation pour C # enum ici et la documentation pour le tableau des valeurs par défaut C # ici .

1
acoelhosantos

Si vous définissez l'énumération par défaut comme l'énumération ayant la plus petite valeur, vous pouvez utiliser ceci:

public enum MyEnum { His = -1, Hers = -2, Mine = -4, Theirs = -3 }

var firstEnum = ((MyEnum[])Enum.GetValues(typeof(MyEnum)))[0];

firstEnum == Mine.

Cela ne suppose pas que l'énumération a une valeur nulle.

1
Tal Segal

La valeur par défaut est la première de la définition. Par exemple:

public enum MyEnum{His,Hers,Mine,Theirs}

Enum.GetValues(typeOf(MyEnum)).GetValue(0);

Ceci retournera His

1
Tony Hopkinson
enum Orientations
{
    None, North, East, South, West
}
private Orientations? _orientation { get; set; }

public Orientations? Orientation
{
    get
    {
        return _orientation ?? Orientations.None;
    }
    set
    {
        _orientation = value;
    }
}

Si vous définissez la propriété sur null, vous obtiendrez Orientations.None on get. La propriété _orientation est null par défaut.

0
Faruk A Feres