C #의 열거 형에서 int 값 가져 오기


1821

Questions(복수) 라는 수업이 있습니다 . 이 클래스에는 Question(단일) 이라는 열거 형 이 있습니다.

public enum Question
{
    Role = 2,
    ProjectFunding = 3,
    TotalEmployee = 4,
    NumberOfServers = 5,
    TopBusinessConcern = 6
}

Questions클래스 에는 해당 객체를 get(int foo)반환하는 함수 Questionsfoo있습니다. 열거 형에서 정수 값을 얻는 쉬운 방법이 Questions.Get(Question.Role)있습니까? 그래서 이런 식으로 할 수 있습니까?


31
다른 방법으로 : cast-int-to-enum-in-c-sharp .
nawfal

11
나는 파티에 늦었 알고 있지만, 대신에 귀하의 방법을 정의하는 get(int foo)당신이 그것을 정의 할 수 있습니다 get(Question foo)다음 방법 내부에 캐스팅을, 당신은 귀하의 메서드를 호출 할 수 있습니다Questions.Get(Question.Role)

답변:


2350

열거 형을 캐스팅하십시오.

int something = (int) Question.Role;

위의 열거 형의 기본 기본 유형은이므로 야생에서 볼 수있는 대다수의 열거 형에서 작동합니다 int.

그러나 cecilphillip이 지적했듯이 열거 형은 다른 기본 유형을 가질 수 있습니다. 열거가 선언 된 경우 uint, long또는 ulong, 그것은 열거의 형식으로 캐스팅해야한다; 예를 들어

enum StarsInMilkyWay:long {Sun = 1, V645Centauri = 2 .. Wolf424B = 2147483649};

당신은 사용해야합니다

long something = (long)StarsInMilkyWay.Wolf424B;

23
@Harry 그것은 사실이 아닙니다. 캐스팅하지 않고 열거를 만들 수 있으며 필수는 아닙니다. 특수한 경우에만 숫자를 할당하며 대부분의 경우 기본값으로 둡니다. 그러나 당신은 할 수 enum Test { Item = 1 }있고 그것이 1 == (int)Test.Item동등한 것을 볼 수 있습니다 .
Jaider

33
@Jaider (int)Test.Item캐스트입니다! ()은 명시적인 캐스트 연산자입니다.
Sinthia V

48
@Sinthia V 그가 당신이 수 있다고 말했다 만들 수 있는이 올바른지, 캐스팅없이
폴 웨이 장군은

7
에 대한 기본 유형은 경우 enum Question아니었다 int그러나 long이 캐스팅 자릅니다 Role의 정수 값을!
quaylar

1
당신은을 받아 들일 때 Enum매개 변수로, 당신은 알고 당신이 얻을 수있는 가능한 모든 값에 고정 된 수의 단지입니다. 반면에 단순히을 취하면 허용되는 값 내에 int있는지 확인해야 int하므로 코드가 복잡해집니다. ```public void MyMethod (int x) {// x로 무언가를한다} public void MyMethod (Enum x) {this.MyMethod ((int) x); }````
percebus

307

모든 열거 형 일체형이 될 수 있기 때문에 ( byte, int, short등), 열거의 기본 적분 값을 얻을 수있는 더 강력한 방법이 사용하게 될 GetTypeCode와 함께 방법 Convert분류 :

enum Sides {
    Left, Right, Top, Bottom
}
Sides side = Sides.Bottom;

object val = Convert.ChangeType(side, side.GetTypeCode());
Console.WriteLine(val);

기본 정수 유형에 관계없이 작동해야합니다.


32
이 기술은 T : enum (실제로 T : struct, IConvertible이지만 다른 이야기) 인 일반적인 유형을 처리 할 때 나에게 가치가 있음을 입증했습니다.
aboy021

1
면의 16 진수 값을 인쇄하기 위해 이것을 어떻게 수정 하시겠습니까? 이 예는 10 진수 값을 보여줍니다. 문제는 var유형 object인이므로 상자를 풀어야하고 내가 원하는 것보다 더 지저분 해집니다.
Mark Lakata

2
나는 당신이 예제를 변경해야한다고 생각 귀하의 예제에서 항상있을 것입니다 . object val = Convert...etcvarobject
메쉬

2
@TimAbell 실제로 말할 수있는 것은 동적으로 컴파일 된 aspx 페이지 (.cs 파일을 라이브 서버에 배포해야 함)가 각 값에 다르게 정수를 할당하고 있다는 것입니다. 즉, 하나의 시스템에서 직렬화 된 객체는 다른 시스템에서 서로 다른 값으로 직렬화를 해제하고 효과적으로 손상을 입히는 것을 의미했습니다 ( 혼란 시간 ). 우리는 MS와 함께 그것을 제기했으며 다른 프레임 워크 버전에서 빌드 할 때 자동 생성 된 정수가 같지 않다고 말한 것을 기억합니다.
NickG

4
@TimAbell 별도의 경우에 개발자가 사용되지 않거나 사용되지 않은 Enum 값을 삭제하여 시퀀스의 다른 모든 값이 1 씩 나옵니다. 따라서 코딩 표준에 따라 ID를 항상 명시 적으로 지정해야합니다. 그렇지 않으면 코드를 추가 / 삭제하거나 자동 서식을 지정 (예 : 알파벳순으로 정렬)하면 데이터가 손상되는 모든 값이 변경됩니다. 모든 Enum 정수를 명시 적으로 지정하도록 강력히 권고합니다. 외부 (데이터베이스) 저장된 값과 상관 관계가있는 경우 매우 중요합니다.
NickG

199

공용 상수를 갖는 정적 클래스로 선언하십시오.

public static class Question
{
    public const int Role = 2;
    public const int ProjectFunding = 3;
    public const int TotalEmployee = 4;
    public const int NumberOfServers = 5;
    public const int TopBusinessConcern = 6;
}

그런 다음로 참조 할 수 Question.Role있으며 항상 int정의한대로 평가합니다 .


31
static readonly int상수는 어려운 값으로 컴파일되기 때문에 사용 합니다. 참조 stackoverflow.com/a/755693/492
CAD 놈

96
이 솔루션은 실제로 강력한 형식의 열거 형의 실제 이점을 제공하지 않습니다. 예를 들어 GameState-enum-parameter를 특정 메서드에만 전달하려면 컴파일러에서 int-variable을 매개 변수로 전달할 수 없습니다.
thgc

12
@CADBloke는 비교할 때마다 변수의 값을 얻기 위해 메소드 호출을하는 반면 두 개의 값 유형을 직접 비교 하기 때문에 사용 const하지 않는 static readonly이유 입니다. static readonlyconst
blockloop

3
@ brettof86 예, 컴파일 제한이 문제가되지 않으면 const가 더 빠를 것입니다.
CAD bloke

2
@ Zack 나는 그것을 잘 설명하지 못했습니다 compilation limitation. 값을 컴파일 할 때 값이 하드 코딩되어 있음을 의미하므로 그 값을 변경하면 값을 사용 하는 모든 어셈블리를 다시 컴파일해야합니다. 값을 변경하면 광범위하게 영향을 미치기 때문에 사용법에 대해 동의합니다.
CAD bloke

87
Question question = Question.Role;
int value = (int) question;

결과입니다 value == 2.


34
임시 변수 질문은 필요하지 않습니다.
Gishu

1
따라서 이러한 Questions.Get (Convert.ToInt16 (Question.Applications))
jim

6
어느 방향 으로든 캐스팅 할 수 있습니다. 지켜야 할 유일한 것은 열거 형이 아무 것도 시행하지 않는다는 것입니다 (이 숫자에 대한 질문이 없더라도 열거 형 값은 288 일 수 있음)
Marc Gravell

@ 짐 : 아니오, 그냥 가치를 캐스트 : Questions.Get ((int) Question.Applications);
Guffa

1
@ 기슈 당신은 ... 의심스러운 말할 수 있습니다. ;)
Felix D.

79

관련 메모에서에서 int값 을 얻으려면 여기에 System.Enum제공 e하십시오.

Enum e = Question.Role;

당신이 사용할 수있는:

int i = Convert.ToInt32(e);
int i = (int)(object)e;
int i = (int)Enum.Parse(e.GetType(), e.ToString());
int i = (int)Enum.ToObject(e.GetType(), e);

마지막 두 가지는 추악합니다. 나는 첫 번째를 선호합니다.


1
두 번째는 가장 빠릅니다.
Johan B

1
Minecraft 모드에서 Mixins를 사용하는 데 익숙한 사람이라면 두 번째는 확실한 승자처럼 보입니다.
Sollace

40

생각보다 쉽습니다. 열거 형은 이미 정수입니다. 그냥 상기 시켜줘야합니다.

int y = (int)Question.Role;
Console.WriteLine(y); // Prints 2

15
Nitpick : 열거 형은 이미 정수입니다. 다른 열거 형은 다른 유형일 수 있습니다. "enum SmallEnum : byte {A, B, C}"
mqp

9
물론 그렇습니다. C # 참조 : "모든 열거 유형에는 기본 유형이 있으며 char을 제외한 모든 정수 유형이 될 수 있습니다."
Michael Petrotta

33

예:

public Enum EmpNo
{
    Raj = 1,
    Rahul,
    Priyanka
}

그리고 코드 뒤에서 열거 형 값을 얻으십시오.

int setempNo = (int)EmpNo.Raj; // This will give setempNo = 1

또는

int setempNo = (int)EmpNo.Rahul; // This will give setempNo = 2

열거 형이 1 씩 증가하고 시작 값을 설정할 수 있습니다. 시작 값을 설정하지 않으면 처음에 0으로 할당됩니다.


6
이것이 실제로 컴파일됩니까?
피터 Mortensen

라즈 인 것이 라훌이나 프리 얀 카일 수 있습니까? 귀하의 가치는 상충되며 0, 1, 2, 4, 8 등과 같이 두 배가되어야합니다. 이것은 열거 형의 핵심 관심사입니다.
Timothy Gonzalez

@TimothyGonzalez는 실제로 명시 적으로 값을 지정하지 않으면 단순히 1을 계산합니다.;)
derHugo

@derHugo는 숫자 값을 10 진수 또는 2 진수로 가정 할 경우에 따라 다릅니다.
Timothy Gonzalez

@TimothyGonzalez 잘 생각하는 것이 훨씬이 없다 ... 난 그냥 기본적으로 그들은 단지 카운트 않는 것을 지적 1int당신이 명시 적으로 정의 제외
derHugo

28

최근에는 보호 된 생성자와 사전 정의 된 정적 인스턴스가있는 클래스를 사용하는 대신에 코드에서 열거 형을 사용하지 않고 변환했습니다 (Roelof- C # Valid Enum Values-Futureproof Method 덕분에 ).

이를 고려하여 아래에 내가이 문제에 접근하는 방법은 다음과 같습니다 (암시 적 변환을 포함하여 int).

public class Question
{
    // Attributes
    protected int index;
    protected string name;
    // Go with a dictionary to enforce unique index
    //protected static readonly ICollection<Question> values = new Collection<Question>();
    protected static readonly IDictionary<int,Question> values = new Dictionary<int,Question>();

    // Define the "enum" values
    public static readonly Question Role = new Question(2,"Role");
    public static readonly Question ProjectFunding = new Question(3, "Project Funding");
    public static readonly Question TotalEmployee = new Question(4, "Total Employee");
    public static readonly Question NumberOfServers = new Question(5, "Number of Servers");
    public static readonly Question TopBusinessConcern = new Question(6, "Top Business Concern");

    // Constructors
    protected Question(int index, string name)
    {
        this.index = index;
        this.name = name;
        values.Add(index, this);
    }

    // Easy int conversion
    public static implicit operator int(Question question) =>
        question.index; //nb: if question is null this will return a null pointer exception

    public static implicit operator Question(int index) =>        
        values.TryGetValue(index, out var question) ? question : null;

    // Easy string conversion (also update ToString for the same effect)
    public override string ToString() =>
        this.name;

    public static implicit operator string(Question question) =>
        question?.ToString();

    public static implicit operator Question(string name) =>
        name == null ? null : values.Values.FirstOrDefault(item => name.Equals(item.name, StringComparison.CurrentCultureIgnoreCase));


    // If you specifically want a Get(int x) function (though not required given the implicit converstion)
    public Question Get(int foo) =>
        foo; //(implicit conversion will take care of the conversion for you)
}

이 방법의 장점은 열거 형에서 얻을 수있는 모든 것을 얻는 것이지만 코드가 훨씬 유연 해졌습니다. 따라서 값에 따라 다른 작업을 수행 해야하는 경우 Question논리를 Question자체에 넣을 수 있습니다 (예 : 선호하는 OO) 패션) 각 시나리오를 다루기 위해 코드 전체에 많은 사례 진술을하는 것과 반대입니다.


NB : C # 6 기능을 사용하도록 2018-04-27에 업데이트 된 답변; 즉, 선언 표현식과 람다 표현식 본문 정의. 원본 코드는 개정 내역 을 참조하십시오 . 이것은 정의를 조금 덜 장황하게 만드는 이점이 있습니다. 이 답변의 접근 방식에 대한 주요 불만 중 하나였습니다.


2
나는 명시 적 캐스트와 그것을 피하기 위해 작성 해야하는 코드 사이의 트레이드 오프라고 생각합니다. 여전히 구현이 너무 길지 않았 으면 좋겠다. +1
Lankymart

3
이와 비슷한 구조의 여러 유형의 클래스를 사용했습니다. 나는 "나중에 바보가되지 않도록"방법론을 따르려고 할 때 그들이 놀라운 일을한다는 것을 안다.
James Haug

20

Question예를 들어 메소드에서 사용하기 위해 유형이되는 변수에 저장된 열거 형 값에 대한 정수를 얻으려면 이 예제에서 작성한 간단하게 수행 할 수 있습니다.

enum Talen
{
    Engels = 1, Italiaans = 2, Portugees = 3, Nederlands = 4, Duits = 5, Dens = 6
}

Talen Geselecteerd;    

public void Form1()
{
    InitializeComponent()
    Geselecteerd = Talen.Nederlands;
}

// You can use the Enum type as a parameter, so any enumeration from any enumerator can be used as parameter
void VeranderenTitel(Enum e)
{
    this.Text = Convert.ToInt32(e).ToString();
}

변수 Geselecteerd가 이므로 창 제목을 4로 변경합니다 Talen.Nederlands. 로 변경 Talen.Portugees하고 메소드를 다시 호출하면 텍스트가 3으로 변경됩니다.


3
네덜란드어로 코딩. 이런.
WiseStrawberry

불행히도이 방법은 성능이 높을수록 성능이 떨어집니다. 필자는 일부 코드에서 시도했으며 시간이 지남에 따라 CPU 사용량이 점점 줄어들면서 응용 프로그램이 느리고 느려졌습니다. 이것은 스레드가 무언가를 기다리고 있음을 암시했습니다-열거 형 매개 변수를 ToInt32 ()에 복싱했기 때문에 가비지 수집이 있다고 가정합니다. 간단한 int.Parse ()로 전환 하여이 열악한 성능을 완전히 제거 할 수 있었고 코드가 얼마나 오래 실행 되더라도 성능은 동일하게 유지되었습니다.
그렉

16

열거 형 값이 존재하는지 확인한 후 구문 분석하려면 다음을 수행하십시오.

// Fake Day of Week
string strDOWFake = "SuperDay";

// Real Day of Week
string strDOWReal = "Friday";

// Will hold which ever is the real DOW.
DayOfWeek enmDOW;

// See if fake DOW is defined in the DayOfWeek enumeration.
if (Enum.IsDefined(typeof(DayOfWeek), strDOWFake))
{
    // This will never be reached since "SuperDay"
    // doesn't exist in the DayOfWeek enumeration.
    enmDOW = (DayOfWeek)Enum.Parse(typeof(DayOfWeek), strDOWFake);
}
// See if real DOW is defined in the DayOfWeek enumeration.
else if (Enum.IsDefined(typeof(DayOfWeek), strDOWReal))
{
    // This will parse the string into it's corresponding DOW enum object.
    enmDOW = (DayOfWeek)Enum.Parse(typeof(DayOfWeek), strDOWReal);
}

// Can now use the DOW enum object.
Console.Write("Today is " + enmDOW.ToString() + ".");

14

어쩌면 나는 그것을 놓쳤지만 간단한 일반 확장 방법을 시도한 사람이 있습니까?

이것은 나를 위해 잘 작동합니다. 이런 방식으로 API에서 유형 캐스트를 피할 수는 있지만 궁극적으로 유형 변경 작업이 발생합니다. 컴파일러가 GetValue <T> 메소드를 작성하도록 Roslyn 을 프로그래밍하는 것이 좋은 경우입니다 .

    public static void Main()
    {
        int test = MyCSharpWrapperMethod(TestEnum.Test1);

        Debug.Assert(test == 1);
    }

    public static int MyCSharpWrapperMethod(TestEnum customFlag)
    {
        return MyCPlusPlusMethod(customFlag.GetValue<int>());
    }

    public static int MyCPlusPlusMethod(int customFlag)
    {
        // Pretend you made a PInvoke or COM+ call to C++ method that require an integer
        return customFlag;
    }

    public enum TestEnum
    {
        Test1 = 1,
        Test2 = 2,
        Test3 = 3
    }
}

public static class EnumExtensions
{
    public static T GetValue<T>(this Enum enumeration)
    {
        T result = default(T);

        try
        {
            result = (T)Convert.ChangeType(enumeration, typeof(T));
        }
        catch (Exception ex)
        {
            Debug.Assert(false);
            Debug.WriteLine(ex);
        }

        return result;
    }
}

아마도 (int) customFlag를하는 것이 전체적으로 타이핑하는 것이 적고 거의 같은 일을합니까?
Tim Keating

Re "아마도보고 싶지 않았지만 간단한 일반 확장 방법을 사용해 본 사람이 있습니까?" : SixOThree했다 "는 사용 연장 방법을 대신" 하고 Bronek 말했다 "당신은 구현하여이 작업을 수행 할 수 있습니다 확장 메서드 정의 된 열거 형을" .
Peter Mortensen

13

그것을하는 또 다른 방법 :

Console.WriteLine("Name: {0}, Value: {0:D}", Question.Role);

결과는 다음과 같습니다.

Name: Role, Value: 2

12
public enum QuestionType
{
    Role = 2,
    ProjectFunding = 3,
    TotalEmployee = 4,
    NumberOfServers = 5,
    TopBusinessConcern = 6
}

... 괜찮은 선언입니다.

결과를 다음과 같이 int로 캐스팅해야합니다.

int Question = (int)QuestionType.Role

그렇지 않으면 유형은 여전히 QuestionType입니다.

이 수준의 엄격함은 C # 방식입니다.

한 가지 대안은 클래스 선언을 대신 사용하는 것입니다.

public class QuestionType
{
    public static int Role = 2,
    public static int ProjectFunding = 3,
    public static int TotalEmployee = 4,
    public static int NumberOfServers = 5,
    public static int TopBusinessConcern = 6
}

선언하는 것이 덜 우아하지만 코드로 캐스트 할 필요는 없습니다.

int Question = QuestionType.Role

또는 많은 영역에서 이러한 유형의 기대를 충족시키는 Visual Basic에 대해 더 편안하게 느낄 수 있습니다.


11
int number = Question.Role.GetHashCode();

number값이 있어야합니다 2.


GetHashCode는 Enum 공통 마스크에서 가치를 얻는 한 가지 방법입니다.
ThanhLD

이 만 "합법적"이라고 주 bool*, byte, ushort, int, 그리고 uint**. 다른 유형에 대한 GetHashCode는 값을 수정합니다 (예 : 일부 비트 시프트 및 xor 수행). (* 1 / 0, ** int로 캐스팅 됨). 그러나 자신의 개인 코드가 아니라면이 작업을 수행하지 마십시오.
AnorZaken

10

정의 된 열거 형에 확장 메소드 를 구현하여이를 수행 할 수 있습니다 .

public static class MyExtensions
{
    public static int getNumberValue(this Question questionThis)
    {
        return (int)questionThis;
    }
}

이렇게하면 현재 열거 형 값의 int 값을 얻는 것이 간단 해집니다.

Question question = Question.Role;
int value = question.getNumberValue();

또는

int value = Question.Role.getNumberValue();

5
Bronek, 당신이 한 일은 실제로 쓰는 데 더 오래 걸리는 (일반이 아닌 btw) 확장 방법을 통해 유익하지 않은 구문을 만드는 것입니다. Tetraneutron의 원래 솔루션보다 더 나은 방법을 보지 못했습니다. 이것을 채팅으로 만들지 말고, 항상 stackoverflow에서 도움을 환영하며 여기있는 모든 사람이 도와 드리겠습니다. 건설적인 비판으로 저의 의견을 받아 들여주십시오.
Benjamin Gruenbaum

2
벤자민, 우선 왜 내 의견을 삭제 했습니까? 나는 당신의 결정을 이해하지 못합니다. 커뮤니티를 통해 다른 사람이 내 의견에 동의 할 수도 있습니다. 확장 방법은 IntelliSense에서 제안합니다. 따라서 귀하의 결정이 공정하고 대표적이지 않다고 생각합니다. 스택에서 많은 유사한 답변을 볼 수 있습니다. 이러한 부정적인 점은 찾기가 더 어려워집니다. 대부분의 경우 정확하고 복사하지 않습니다.
Bronek

3
@Bronek 당신이 나를 핑하지 않으면 나는 당신이 대답했다는 표시를받지 못합니다. 나는 않았다 없습니다 내가 능력이 있거나 그렇게하고 싶지 않은 당신의 코멘트를 삭제합니다. 아마도 mod가 들어 와서 삭제했을 가능성이 있습니다. 중재자의주의를 끌기 위해 플래그를 지정하고 메타 스택 오버 플로우 에 대해 왜 또는 더 나은지 묻습니다 . 나는 프로그래밍 관점에서 귀하의 솔루션에 대한 의견을 가지고 있습니다. 이것은 내 의견에 완벽합니다. 이것은 의견을 시작하기위한 것이므로 개인적으로 취할 필요가 없습니다.
Benjamin Gruenbaum

8

대신 확장 방법을 사용하십시오.

public static class ExtensionMethods
{
    public static int IntValue(this Enum argEnum)
    {
        return Convert.ToInt32(argEnum);
    }
}

그리고 사용법이 약간 더 아름답습니다.

var intValue = Question.Role.IntValue();

7
public enum Suit : int
{
    Spades = 0,
    Hearts = 1,
    Clubs = 2,
    Diamonds = 3
}

Console.WriteLine((int)(Suit)Enum.Parse(typeof(Suit), "Clubs"));

// From int
Console.WriteLine((Suit)1);

// From a number you can also
Console.WriteLine((Suit)Enum.ToObject(typeof(Suit), 1));

if (typeof(Suit).IsEnumDefined("Spades"))
{
    var res = (int)(Suit)Enum.Parse(typeof(Suit), "Spades");
    Console.Out.WriteLine("{0}", res);
}

소송 - "10 (카드 게임) 색상 및 / 또는 같은 스페이드, 하트, 다이아몬드 또는 기존의 앵글로, 스페인과 프랑스 카드 놀이의 클럽과 같은 특정 엠 블 럼,에 의해 구별 카드의 팩의 세트의 각."
Peter Mortensen

샘플 코드에 대한 설명은 순서대로 이루어집니다 ( 주석이 아닌 답변편집하여 ).
Peter Mortensen

제로는 일반적으로 설정되지 않은 / 알 수없는 열거의 상태처럼 그것을 정의하는 특별한 예약되어
차드 그랜트

6

사용하다:

Question question = Question.Role;
int value = question.GetHashCode();

결과는 value == 2 .

열거 형이 내부에 맞는 경우에만 해당됩니다 int.


1
열거 형 int이 물론 GetHashCode정수에 맞는 경우에만 해당됩니다 .
RB.

5

열거 형은 여러 기본 유형으로 선언 할 수 있으므로 열거 형을 캐스트하는 일반 확장 메소드가 유용 할 수 있습니다.

enum Box
{
    HEIGHT,
    WIDTH,
    DEPTH
}

public static void UseEnum()
{
    int height = Box.HEIGHT.GetEnumValue<int>();
    int width = Box.WIDTH.GetEnumValue<int>();
    int depth = Box.DEPTH.GetEnumValue<int>();
}

public static T GetEnumValue<T>(this object e) => (T)e;

4

다음은 확장 방법입니다

public static string ToEnumString<TEnum>(this int enumValue)
{
    var enumString = enumValue.ToString();
    if (Enum.IsDefined(typeof(TEnum), enumValue))
    {
        enumString = ((TEnum) Enum.ToObject(typeof (TEnum), enumValue)).ToString();
    }
    return enumString;
}

4

int 또는 더 작은 열거 형을 사용하는 가장 좋아하는 핵 :

GetHashCode();

열거 형

public enum Test
{
    Min = Int32.MinValue,
    One = 1,
    Max = Int32.MaxValue,
}

이,

var values = Enum.GetValues(typeof(Test));

foreach (var val in values)
{
    Console.WriteLine(val.GetHashCode());
    Console.WriteLine(((int)val));
    Console.WriteLine(val);
}

출력

one
1
1
max
2147483647
2147483647
min
-2147483648
-2147483648

기권:

long 기반의 열거 형에서는 작동하지 않습니다.


3

내가 생각할 수있는 가장 쉬운 해결책은 다음 Get(int)과 같이 메소드를 오버로드하는 것입니다 .

[modifiers] Questions Get(Question q)
{
    return Get((int)q);
}

여기서는 [modifiers]일반적으로 Get(int)방법 과 동일 할 수 있습니다 . Questions클래스를 편집 할 수 없거나 어떤 이유로 든 원하지 않는 경우 확장 프로그램을 작성하여 메서드를 오버로드 할 수 있습니다.

public static class Extensions
{
    public static Questions Get(this Questions qs, Question q)
    {
        return qs.Get((int)q);
    }
}

3

"열거 형에서 'int'값을 얻으려면"을 제안하려는 예는 다음과 같습니다.

public enum Sample
{
    Book = 1, 
    Pen = 2, 
    Pencil = 3
}

int answer = (int)Sample.Book;

이제 대답은 1입니다.



2

enum을 int로 변환하는 대신 이것을 시도하십시오 :

public static class ReturnType
{
    public static readonly int Success = 1;
    public static readonly int Duplicate = 2;
    public static readonly int Error = -1;        
}

2

Visual Basic에서는 다음과 같아야합니다.

Public Enum Question
    Role = 2
    ProjectFunding = 3
    TotalEmployee = 4
    NumberOfServers = 5
    TopBusinessConcern = 6
End Enum

Private value As Integer = CInt(Question.Role)

3
문제는 C #입니다.
Ctrl S

2
제목은 "C #의 enum에서 int 값 가져 오기" 라고 말합니다 .
Peter Mortensen

0

현재 언어 기능이 포함 된이 확장 방법을 생각해 냈습니다. 동적을 사용하여이를 일반적인 방법으로 만들고 호출을보다 간단하고 일관성있게 유지하는 유형을 지정할 필요가 없습니다.

public static class EnumEx
{
    public static dynamic Value(this Enum e)
    {
        switch (e.GetTypeCode())
        {
            case TypeCode.Byte:
            {
                return (byte) (IConvertible) e;
            }

            case TypeCode.Int16:
            {
                return (short) (IConvertible) e;
            }

            case TypeCode.Int32:
            {
                return (int) (IConvertible) e;
            }

            case TypeCode.Int64:
            {
                return (long) (IConvertible) e;
            }

            case TypeCode.UInt16:
            {
                return (ushort) (IConvertible) e;
            }

            case TypeCode.UInt32:
            {
                return (uint) (IConvertible) e;
            }

            case TypeCode.UInt64:
            {
                return (ulong) (IConvertible) e;
            }

            case TypeCode.SByte:
            {
                return (sbyte) (IConvertible) e;
            }
        }

        return 0;
    }

제발 아니, 당신은 한 줄 Convert.Changetype (e, e.GetTypeCode ()) 에서이 모든 작업을 수행하고 역학이나 확장 방법이 필요없는 개체를 다시 얻을 수 있습니다
Chad Grant

변환 사용에 동의하지 않습니다. 캐스트를 사용하는 것이 더 쉬울 것입니다. 내 의도는 캐스트를 사용하지 않고 열거 형을 가치로 변환 할 수있게하는 것이 었습니다. 이렇게하면 관련된 모든 캐스트를 변경하지 않고도 열거 형 유형을 변경할 수 있습니다. 그러나 언제 이런 일이 발생합니까? 확장 방법이 올바르게 작동합니다. 그러나 동적이기 때문에 complier가 검사를 입력 할 수 없다는 점에서 문제가 있습니다 (명확하게 전체 문장에 대해). 실행 할 때 유형 검사가 발생한다는 것을 의미합니다-좋은 해결책은 아닙니다. 나는 다시 캐스트로 돌아갈 것이라고 생각합니다.
Jeff

1
나는이 코드가 무의미하고 아무것도 달성하지 못한다고 실제로 사용하면 문제를 악화시킵니다. 이 솔루션을 제거하는 것이 좋습니다
Chad Grant
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.