Как получить базовое значение перечисления
Вопрос
У меня есть следующее объявленное перечисление:
public enum TransactionTypeCode { Shipment = 'S', Receipt = 'R' }
Как мне получить значение 'S' из TransactionTypeCode.Отгрузка или 'R' из TransactionTypeCode.Получение?
Просто выполняем TransactionTypeCode.toString() выдает строку с перечисляемым именем "Отгрузка" или "Квитанция", так что это ничего не меняет.
Решение
Попробуй это:
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);
ВЫХОДНОЙ СИГНАЛ:Сколько: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.
Это повторяющийся вопрос для меня, я всегда забываю, что простое приведение дает вам ценность.