문제
다음 열거형을 선언했습니다.
public enum TransactionTypeCode { Shipment = 'S', Receipt = 'R' }
TransactionTypeCode.Shipment에서 'S' 값을 가져오거나 TransactionTypeCode.Receipt에서 'R' 값을 얻으려면 어떻게 해야 합니까?
단순히 TransactionTypeCode.ToString()을 수행하면 Enum 이름 "Shipment" 또는 "Receipt"의 문자열이 제공되므로 겨자가 잘리지 않습니다.
해결책
이 시도:
string value = (string)TransactionTypeCode.Shipment;
다른 팁
열거형의 기본 유형을 확인한 다음 적절한 유형으로 변환해야 합니다.
public enum SuperTasks : int
{
Sleep = 5,
Walk = 7,
Run = 9
}
private void btnTestEnumWithReflection_Click(object sender, EventArgs e)
{
SuperTasks task = SuperTasks.Walk;
Type underlyingType = Enum.GetUnderlyingType(task.GetType());
object value = Convert.ChangeType(task, underlyingType); // x will be int
}
나는 Enum.GetValues()가 당신이 찾고 있는 것이라고 믿습니다.
열거형의 기본 유형은 여전히 int입니다. 단지 다음에서 암시적인 변환이 있다는 것뿐입니다. char
에게 int
몇 가지 이유.귀하의 열거 형은 다음과 같습니다
TransactionTypeCode { Shipment = 83, Receipt = 82, }
또한 enum
다음을 제외한 모든 정수 유형을 기본 유형으로 가질 수 있습니다. char
, 아마도 의미론적인 이유 때문일 것입니다.이건 불가능 해:
TransactionTypeCode : char { Shipment = 'S', Receipt = 'R', }
얻으려면 char
값을 되돌리면 캐스트를 사용할 수 있습니다.
var value = (char)TransactionTypeCode.Shipment;
// or to make it more explicit:
var value = Convert.ToChar(TransactionTypeCode.Shipment);
두 번째는 복싱을 유발하므로 더 나쁜 결과가 발생합니다.그래서 조금 더 좋을 수도 있습니다
var value = Convert.ToChar((int)TransactionTypeCode.Shipment);
하지만 못생긴.성능/가독성 트레이드오프를 고려할 때 저는 첫 번째(캐스트) 버전을 선호합니다..
나는 그것을 검색하고 있었고 솔루션이 Convert 클래스를 사용하게됩니다.
int value = Convert.ToInt32(TransactionTypeCode.Shipment);
얼마나 쉬운지 보세요
이것이 내가 일반적으로 열거형을 설정하는 방법입니다.
public enum TransactionTypeCode {
Shipment("S"),Receipt ("R");
private final String val;
TransactionTypeCode(String val){
this.val = val;
}
public String getTypeCode(){
return val;
}
}
System.out.println(TransactionTypeCode.Shipment.getTypeCode());
열거형의 기본 값은 숫자여야 합니다.기본 값의 유형이 알려진 경우 단순 형변환은 열거형의 특정 인스턴스에 대한 기본 값을 반환합니다.
enum myEnum : byte {Some = 1, SomeMore, Alot, TooMuch};
myEnum HowMuch = myEnum.Alot;
Console.Writeline("How much: {0}", (byte)HowMuch);
산출:얼마나 많이:삼
또는 (원래 질문에 더 가깝습니다)
enum myFlags:int {None='N',Alittle='A',Some='S',Somemore='M',Alot='L'};
myFlags howMuch = myFlags.Some;
Console.WriteLine("How much: {0}", (char)howMuch);
//If you cast as int you get the ASCII value not the character.
이것은 나에게 반복되는 질문입니다. 저는 간단한 캐스트를 통해 가치를 얻을 수 있다는 사실을 항상 잊어버립니다.