Как получить базовую стоимость перечисления - PullRequest
14 голосов
/ 19 сентября 2008

У меня объявлено следующее перечисление:

 public enum TransactionTypeCode { Shipment = 'S', Receipt = 'R' }

Как получить значение «S» из TransactionTypeCode.Shipment или «R» из TransactionTypeCode.Receipt?

Простое выполнение TransactionTypeCode.ToString () дает строку с именем Enum «Отгрузка» или «Получение», чтобы не гореть.

Ответы [ 7 ]

30 голосов
/ 19 февраля 2010

Вы должны проверить базовый тип перечисления, а затем преобразовать в правильный тип:

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
    }    
2 голосов
/ 19 сентября 2008

Я считаю, что Enum.GetValues ​​() - это то, что вы ищете.

1 голос
/ 01 декабря 2013

Базовым типом вашего перечисления по-прежнему является 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);

но безобразно. Учитывая компромисс между производительностью и читабельностью, я предпочитаю первую (кастовую) версию ..

1 голос
/ 19 сентября 2008

Попробуйте это:

string value = (string)TransactionTypeCode.Shipment;
0 голосов
/ 25 июня 2015

базовые значения перечисления должны быть числовыми. Если тип базовых значений известен, то простое приведение возвращает базовое значение для данного экземпляра перечисления.

enum myEnum : byte {Some = 1, SomeMore, Alot, TooMuch};
myEnum HowMuch = myEnum.Alot;
Console.Writeline("How much: {0}", (byte)HowMuch);

ВЫХОД: Сколько: 3

ИЛИ (ближе к исходному вопросу)

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.

Это повторяющийся вопрос для меня, я всегда забываю, что простое приведение дает вам значение.

0 голосов
/ 01 апреля 2009

Я искал это, и я получил решение Используйте класс преобразования

int value = Convert.ToInt32(TransactionTypeCode.Shipment);

посмотри как это просто

0 голосов
/ 24 сентября 2008

Вот как я обычно настраиваю свои перечисления:

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());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...