etc./StackOverFlow

C#의 enum에서 int 값 가져오기

청렴결백한 만능 재주꾼 2021. 12. 20. 10:11
반응형

질문자 :jim


Questions (복수형)이라는 수업이 있습니다. 이 클래스에는 다음과 같은 Question

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

Questions 클래스에는 foo Questions 객체를 반환하는 get(int foo) 함수가 있습니다. 다음과 같이 할 수 있도록 열거형에서 정수 값을 얻는 쉬운 방법이 있습니까? Questions.Get(Question.Role)



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

 int something = (int) Question.Role;

int 이므로 위의 내용은 야생에서 볼 수 있는 대부분의 열거형에 대해 작동합니다.

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

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

당신은 사용해야합니다

 long something = (long)StarsInMilkyWay.Wolf424B;

Tetraneutron

열거형은 모든 정수 유형( 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);

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


cecilphillip

public 상수가 있는 정적 클래스로 선언합니다.

 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 또는 정의한 대로 평가됩니다.


PablosBicicleta

관련 메모에서 System.Enum int 값을 얻으려면 여기에 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);

마지막 2개는 그냥 무난합니다. 나는 첫 번째 것을 선호합니다.


nawfal

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

value == 2 됩니다.


jerryjvl

생각보다 쉽습니다. 열거형은 이미 int입니다. 다음과 같이 상기시켜주면 됩니다.

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

Michael Petrotta

예시:

 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으로 할당됩니다.


sooraj

저는 최근에 코드에서 열거형을 사용하지 않고 보호된 생성자와 미리 정의된 정적 인스턴스가 있는 클래스를 사용하도록 전환했습니다(Roelof - C# Confirm 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 자체에 논리를 넣을 수 있습니다(즉, 각 시나리오를 다루기 위해 코드 전체에 많은 case 문을 넣는 것과는 대조적으로 선호하는 OO 패션).


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


JohnLBevan

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 변수가 Talen.Nederlands 이므로 창 제목이 4로 변경됩니다. Talen.Portugees 변경하고 메서드를 다시 호출하면 텍스트가 3으로 변경됩니다.


Mathijs Van Der Slagt

열거형 값이 존재하는지 확인한 다음 이를 구문 분석하려면 다음을 수행할 수도 있습니다.

 // 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() + ".");

Nathon

그것을 하는 또 다른 방법:

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

결과:

 Name: Role, Value: 2

plavozont

내가 놓쳤을 수도 있지만 간단한 일반 확장 방법을 시도한 사람이 있습니까?

이것은 나를 위해 잘 작동합니다. 이 방법으로 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; } }

Doug

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이 더 편안할 수 있습니다.


WonderWorker

int number = Question.Role.GetHashCode();

number 2 값을 가져야 합니다.


JaimeArmenta

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

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

그리고 사용법이 약간 더 예쁘다:

 var intValue = Question.Role.IntValue();

SixOThree

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

 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();

Bronek

사용하다:

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

value == 2 됩니다.

int 내부에 맞는 경우에만 해당됩니다.


GinCanhViet

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

Gauravsa

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

 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;

Jeffrey Ferreiras

다음은 확장 방법입니다

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

Kamran Shahid

내가 생각할 수 있는 가장 쉬운 해결책은 다음과 같이 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); } }

Grx70

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 기반 열거형에는 작동하지 않습니다.


Erik Karlsson

enum을 int로 변환하는 대신 다음을 시도하십시오.

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

Nalan Madheswaran

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

 public enum Sample { Book = 1, Pen = 2, Pencil = 3 } int answer = (int)Sample.Book;

이제 답은 1이 될 것입니다.


Vivek

다른 언어에서 사용할 수 있으므로 Type Casting을 사용해야 합니다.

enum 이 다음과 같으면-

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

int 로 캐스팅해야합니다. 그런 다음 이것을하십시오-

 Question q = Question.Role; ............. ............. int something = (int) q;

답장-

C#에는 두 가지 유형의 캐스팅이 있습니다.

  • 암시적 캐스팅( 자동 ) - 더 작은 유형을 더 큰 유형 크기로 변환

char -> int -> long -> float -> double

  • 명시적 캐스팅( 수동 ) - 더 큰 유형을 다음과 같은 더 작은 크기 유형으로 변환

double -> float -> long -> int -> char

여기 에서 더 많은 것을 찾을 수 있습니다.


Abrar Jahin

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

 Public Enum Question Role = 2 ProjectFunding = 3 TotalEmployee = 4 NumberOfServers = 5 TopBusinessConcern = 6 End Enum Private value As Integer = CInt(Question.Role)

VPP

열거 형의 모든 정수 값이 포함 된 목록을 제공합니다.

열거형 값 나열 = 열거형.GetValues(typeof(EnumClass)).Cast().ToList();


IggyBar

public enum ViewType { List = 1, Table = 2, }; // You can use the Enum type as a parameter, so any enumeration from any enumerator // cshtml // using proyects.Helpers // @if (Model.ViewType== (int)<variable>.List )

Tayron Ovares

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

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

Jeff

출처 : http:www.stackoverflow.com/questions/943398/get-int-value-from-enum-in-c-sharp

반응형