[C#] 값을 변경하지 않고 Enum 유형의 기본값 선택

C #에서 Enum 유형을 속성으로 장식하거나 값을 변경하지 않고 기본값을 지정하기 위해 다른 작업을 수행 할 수 있습니까? 필요한 숫자는 어떤 이유로 든 석재로 설정 될 수 있으며 여전히 기본값을 제어하는 ​​것이 편리합니다.

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

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



답변

enum(실제로 모든 값 유형) 의 기본값 은 0입니다 enum. 해당 값이 유효하지 않은 경우에도 마찬가지입니다 . 변경할 수 없습니다.


답변

열거 형의 기본값은 0입니다. 따라서 하나의 열거자를 기본값으로 설정하려면 해당 열거자를 0으로 설정하고 다른 모든 열거자를 0이 아닌 값으로 설정하십시오 (여러 열거자가있는 경우 값이 0 인 첫 번째 열거자가 해당 열거의 기본값이 됨). 0 값으로).

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'

열거 자에 명시적인 값이 필요하지 않은 경우 “기본적으로 첫 번째 열거자는 0 값을 가지며 각 연속 열거 자의 값은 다음과 같이 증가하므로 첫 번째 열거자는 기본 열거자가 될 것이어야합니다. 1.” ( C # 참조 )

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

Orientation o; // initialized to 'None'


답변

0이 올바른 기본값으로 작동하지 않으면 구성 요소 모델을 사용하여 열거 형에 대한 해결 방법을 정의 할 수 있습니다.

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

그리고 당신은 전화 할 수 있습니다 :

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

참고 : 파일 맨 위에 다음 줄을 포함해야합니다.

using System.ComponentModel;

이것은 열거 형의 실제 C # 언어 기본값을 변경하지 않지만 원하는 기본값을 표시하고 얻는 방법을 제공합니다.


답변

열거의 기본값은 열거가 0에 해당하는 것입니다. 나는 이것이 속성이나 다른 방법으로 변경 될 수 있다고 생각하지 않습니다.

(MSDN의 말 : “열거 E의 기본값은 식 (E) 0에 의해 생성 된 값입니다.”)


답변

할 수는 없지만 원하는 경우 속임수를 쓸 수 있습니다. 🙂

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

이 구조체를 간단한 열거 형으로 사용합니다.
트릭 자체를 사용하기 위해
기본적
으로 pa == Orientation.East (또는 원하는 값)를 만들 수있는 경우 int에서 코드로 변환해야합니다.
구현이 있습니다.

        #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


답변

도움이 될 수있는 또 하나의 방법은 일종의 “별명”을 사용하는 것입니다. 예를 들면 다음과 같습니다.

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

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


답변

실제로 enum의 기본값은 enum값 의 첫 번째 요소 입니다.0 .

예를 들어 :

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;