Nome da string de enumeração do valor

407

Eu tenho uma construção enum como esta:

public enum EnumDisplayStatus
{
    None    = 1,
    Visible = 2,
    Hidden  = 3,
    MarkedForDeletion = 4
}

No meu banco de dados, as enumerações são referenciadas por valor. Minha pergunta é: como posso voltar a representação numérica do enum para o nome da string.

Por exemplo, dado 2o resultado deve ser Visible.

jdee
fonte
25
Eu acredito que, agora há uma maneira mais fácil de fazer isso com o VS 2015 nameof(EnumDisplayStatus.Visible)Espero que ajude alguém
Gabriel Marius Popescu

Respostas:

542

Você pode converter as intcostas para um membro de enumeração com uma conversão simples e, em seguida, chamar ToString():

int value = GetValueFromDb();
var enumDisplayStatus = (EnumDisplayStatus)value;
string stringValue = enumDisplayStatus.ToString();
Kent Boogaart
fonte
13
Atualização: apenas determinadas sobrecargas usando IFormatProvider foram descontinuadas. ToString () está bom. Consulte groups.google.com/group/DotNetDevelopment/browse_thread/thread/…
AndyM
Qual é o comportamento em caso de enum Foo { A = 1, B= 1 }?
Dbkk 5/07
3
@dbkk a documentação afirma que, com relação às enumerações ", seu código não deve fazer suposições sobre qual string será retornada". por causa da situação precisa citada. consulte msdn.microsoft.com/en-us/library/16c1xs4z.aspx
Paul D'Ambra
4
Uma solução atualizada: msdn.microsoft.com/en-us/library/…
Jack
4
mais curto: var (valor (EnumDisplayStatus)) = stringValue .ToString ()
redwards510
188

Se você precisar obter uma string "Visible"sem obter EnumDisplayStatusinstância, poderá fazer o seguinte:

int dbValue = GetDBValue();
string stringValue = Enum.GetName(typeof(EnumDisplayStatus), dbValue);
algreat
fonte
5
Se você sobre a resposta de Mandoleen há uma imprecisão: Enum.GetName retorna uma string, não um Enum
algreat
Isso usa reflexão ou o compilador cria um dicionário auxiliar para uso nos bastidores?
palswim
155

Tente o seguinte:

string m = Enum.GetName(typeof(MyEnumClass), value);
Mandoleen
fonte
@ nilco essa resposta é boa, mas prefiro a resposta de Kents, principalmente porque tenho um atributo personalizado nas minhas enumerações "Descrição". Em seguida, tenho uma extensão de enumeração para obter a descrição - isso é para exibição na tela para o usuário.
Harag
60

Usa isto:

string bob = nameof(EnumDisplayStatus.Visible);
James Cooke
fonte
9
É necessário C # 6+.
21418 Adam K Dean
10
@AZChad é uma grande coisa para saber, com certeza; mas realmente não se aplica ao cenário do OP, pois os valores são provenientes de um banco de dados (portanto: valores em tempo de execução, não em tempo de compilação)
Marc Gravell
22

você pode simplesmente lançar

int dbValue = 2;
EnumDisplayStatus enumValue = (EnumDisplayStatus)dbValue;
string stringName = enumValue.ToString(); //Visible

ah .. ken me venceu :)

Tem
fonte
Agora Kent recebe todo o representante da "primeira resposta". Nice Kent! : p
Matt Kocaj
12

DB para C #

EnumDisplayStatus status = (EnumDisplayStatus)int.Parse(GetValueFromDb());

C # para DB

string dbStatus = ((int)status).ToString();

fonte
12

SOLUÇÃO:

int enumValue = 2; // The value for which you want to get string 
string enumName = Enum.GetName(typeof(EnumDisplayStatus), enumValue);

Além disso, o uso de GetName é melhor que a conversão explícita do Enum .

[Código de referência de desempenho]

Stopwatch sw = new Stopwatch (); sw.Start (); sw.Stop (); sw.Reset ();
double sum = 0;
int n = 1000;
Console.WriteLine ("\nGetName method way:");
for (int i = 0; i < n; i++) {
   sw.Start ();
   string t = Enum.GetName (typeof (Roles), roleValue);
   sw.Stop ();
   sum += sw.Elapsed.TotalMilliseconds;
   sw.Reset ();
}
Console.WriteLine ($"Average of {n} runs using Getname method casting way: {sum / n}");
Console.WriteLine ("\nExplicit casting way:");
for (int i = 0; i < n; i++) {
   sw.Start ();
   string t = ((Roles)roleValue).ToString ();
   sw.Stop ();
   sum += sw.Elapsed.TotalMilliseconds;
   sw.Reset ();
}
Console.WriteLine ($"Average of {n} runs using Explicit casting way: {sum / n}");

[Resultado da amostra]

GetName method way:
Average of 1000 runs using Getname method casting way: 0.000186899999999998
Explicit casting way:
Average of 1000 runs using Explicit casting way: 0.000627900000000002
Naveen Kumar V
fonte
2
Esta é uma cópia de uma resposta de 7 anos. Você pode explicar por que o seu é melhor que o original?
nvoigt 22/02/19
@ nvoigt Porque, se eu estiver correto, a API ToString () no Enum agora está obsoleta. [ docs.microsoft.com/en-us/dotnet/api/…
Naveen Kumar V
Então ... pelo menos duas outras respostas já fornecem o código que você postou. O que o seu fornece sobre o de Mandoleen ou algreat?
Nvoigt 22/02/19
@nvoigt Eles não mencionaram seu desempenho em comparação com a transmissão explícita. Isso é suficiente para você gostar da minha resposta? : p Obrigado mesmo assim, espero que ajude alguém. :)
Naveen Kumar V
Parece que temos um problema de comunicação. Você está em um dispositivo móvel ou talvez não tenha percorrido o suficiente? Há duas cópias exatas da sua resposta de 7 anos atrás. Eu nomeei os respondentes, para que eles sejam fáceis de encontrar. O que sua resposta fornece que não está aqui há pelo menos sete anos?
nvoigt 22/02/19
9

A solução de tempo de compilação mais rápida usando nameof expressão .

Retorna o literal da enumeração.

public enum MyEnum {
    CSV,
    Excel
}


string enumAsString = nameof(MyEnum.CSV)
// enumAsString = "CSV"

Nota:

  • Você não gostaria de nomear um enum em maiúsculas, mas usado para demonstrar a distinção entre maiúsculas e minúsculas nameof.
Colher
fonte
Isso deveria ter sido uma resposta.
LinPy fã
@LinPyfan Fico feliz que funcione bem! Esta é uma relativamente nova em comparação com a data do OP.
Colher
4

Só precisa:

string stringName = EnumDisplayStatus.Visible.ToString("f");
// stringName == "Visible"
Al3x_M
fonte
1
na maioria dos casos, isso é praticamente idêntico à resposta principal de 10 anos atrás; a adição do "f"especificador é diferenciada e pode ou não ser o que o chamador deseja (depende do que ele deseja): docs.microsoft.com/en-us/dotnet/standard/base-types/…
Marc Gravell
Eu não prestei atenção na data ahah. Eu acho que é bom atualizar um pouco a solução antiga como esta. Não serei o último a abrir esta página. E obrigado pela sua precisão! :)
Al3x_M
3

Para obter o valor [String] da String:

EnumDisplayStatus enumDisplayStatus = (EnumDisplayStatus)GetDBValue();
string stringValue = $"{enumDisplayStatus:G}"; 

E para obter o valor da enumeração:

string stringValue = $"{enumDisplayStatus:D}";
SetDBValue(Convert.ToInt32(stringValue ));
Muhammad Aqib
fonte
Por que não apenas .ToString ()? 'facepalm'
MeTitus
3

eu usei esse código dado abaixo

 CustomerType = ((EnumCustomerType)(cus.CustomerType)).ToString()
Biddut
fonte
1

Basta converter o int para o tipo de enumeração:

EnumDisplayStatus status = (EnumDisplayStatus) statusFromDatabase;
string statusString = status.ToString();
lacop
fonte