Como pode int
ser convertido para um enum
em c #?
3193
De uma sequência:
YourEnum foo = (YourEnum) Enum.Parse(typeof(YourEnum), yourString);
// The foo.ToString().Contains(",") check is necessary for enumerations marked with an [Flags] attribute
if (!Enum.IsDefined(typeof(YourEnum), foo) && !foo.ToString().Contains(","))
{
throw new InvalidOperationException($"{yourString} is not an underlying value of the YourEnum enumeration.")
}
De um int:
YourEnum foo = (YourEnum)yourInt;
Atualizar:
Do número, você também pode
YourEnum foo = (YourEnum)Enum.ToObject(typeof(YourEnum) , yourInt);
YourEnum
for dinâmico e só for conhecido em tempo de execução, e o que eu quero é converterEnum
?var result = Enum.TryParse(yourString, out yourEnum)
hoje em dia (e verificando o resultado para determinar se a conversão falhou).Enum.Parse
true
YourEnum foo = (YourEnum) Enum.Parse(typeof(YourEnum), yourString, true);
Basta transmitir:
Você pode verificar se está dentro do alcance usando Enum.IsDefined :
fonte
Enum.IsDefined
, lembre-se de que isso pode ser perigoso: msdn.microsoft.com/en-us/library/ms229025(VS.90).aspxIsDefined
para verificar os valores de entrada, você se deixa vulnerável a pessoas que adicionam novos valores de enum posteriormente, o que passaria em umaIsDefined
verificação (uma vez que o novo existe no novo código), mas que pode não funcionar com o código original que você escreveu. Portanto, é mais seguro especificar explicitamente os valores de enumeração que seu código pode manipular.Como alternativa, use um método de extensão em vez de uma linha:
Uso:
OU
fonte
System.String
parece poluir o espaço para nome #Penso que para obter uma resposta completa, as pessoas precisam saber como as enums funcionam internamente no .NET.
Como as coisas funcionam
Uma enumeração no .NET é uma estrutura que mapeia um conjunto de valores (campos) para um tipo básico (o padrão é
int
). No entanto, você pode realmente escolher o tipo integral para o qual sua enum mapeia:Nesse caso, a enumeração é mapeada para o
short
tipo de dados, o que significa que será armazenado na memória como um curto e se comportará como um curto quando você o converter e usar.Se você olhar para ele do ponto de vista da IL, um enum (normal, int) será assim:
O que deve chamar sua atenção aqui é que o
value__
arquivo é armazenado separadamente dos valores da enumeração. No caso da enumFoo
acima, o tipo devalue__
é int16. Isso basicamente significa que você pode armazenar o que quiser em uma enumeração, desde que os tipos correspondam .Neste ponto, gostaria de salientar que
System.Enum
é um tipo de valor, o que basicamente significa queBarFlag
ocupará 4 bytes na memória eFoo
ocupará 2 - por exemplo, o tamanho do tipo subjacente (na verdade é mais complicado que isso, mas Ei...).A resposta
Portanto, se você tem um número inteiro que deseja mapear para uma enumeração, o tempo de execução precisa fazer apenas duas coisas: copiar os 4 bytes e nomeá-la de outra forma (o nome da enumeração). A cópia está implícita porque os dados são armazenados como tipo de valor - isso basicamente significa que, se você usar código não gerenciado, poderá simplesmente trocar enumerações e números inteiros sem copiar dados.
Para torná-lo seguro, acho que é uma prática recomendada saber que os tipos subjacentes são iguais ou implicitamente conversíveis e garantir que os valores da enumeração existam (eles não são verificados por padrão!).
Para ver como isso funciona, tente o seguinte código:
Observe que a conversão para
e2
também funciona! Da perspectiva do compilador acima, isso faz sentido: ovalue__
campo é simplesmente preenchido com 5 ou 6 e, quandoConsole.WriteLine
chamadasToString()
, o nome dee1
é resolvido enquanto o nome dee2
não é.Se não foi isso que você pretendia, use
Enum.IsDefined(typeof(MyEnum), 6)
para verificar se o valor que você está convertendo é mapeado para uma enumeração definida.Observe também que sou explícito sobre o tipo subjacente da enum, mesmo que o compilador realmente verifique isso. Estou fazendo isso para garantir que não tenha surpresas no caminho. Para ver essas surpresas em ação, você pode usar o seguinte código (na verdade, eu já vi isso acontecer muito no código do banco de dados):
fonte
int
! =short
, Será lançada (a remoção do unboxing falha). Se você o fizerobject o = (short)5;
, funcionará, porque os tipos corresponderão. Não é sobre o alcance, é realmente sobre o tipo.Veja o seguinte exemplo:
fonte
Estou usando este pedaço de código para converter int para minha enumeração:
Acho a melhor solução.
fonte
Abaixo está uma boa classe de utilitário para Enums
fonte
Para valores numéricos, isso é mais seguro, pois retornará um objeto, não importa o que:
fonte
Se você estiver pronto para o 4.0 .NET Framework, há uma nova função Enum.TryParse () que é muito útil e funciona bem com o atributo [Flags]. Consulte o método Enum.TryParse (String, TEnum%)
fonte
Se você tiver um número inteiro que atue como uma máscara de bits e possa representar um ou mais valores em uma enumeração [Flags], poderá usar esse código para analisar os valores de sinalizadores individuais em uma lista:
Observe que isso pressupõe que o tipo subjacente do
enum
é um número inteiro de 32 bits assinado. Se fosse um tipo numérico diferente, você teria que alterar os 32 codificados permanentemente para refletir os bits desse tipo (ou derivá-lo programaticamente usandoEnum.GetUnderlyingType()
)fonte
Às vezes você tem um objeto para o
MyEnum
tipo. GostarEntão:
fonte
Este é um método de conversão segura com reconhecimento de enumeração de sinalizadores:
fonte
Enum
nãostruct
, o que significa que não precisamos confiar na verificação do tempo de execução!Para converter uma string em constante ENUM ou int em ENUM, precisamos usar a função Enum.Parse. Aqui está um vídeo do youtube https://www.youtube.com/watch?v=4nhx4VwdRDk que realmente demonstra com string e o mesmo se aplica a int.
O código segue como mostrado abaixo, onde "vermelho" é a sequência e "MyColors" é a cor ENUM que possui constantes de cores.
fonte
Afastando-me um pouco da pergunta original, mas encontrei uma resposta para a pergunta Stack Overflow Obter valor int de enum útil. Crie uma classe estática com
public const int
propriedades, permitindo que você colete facilmente um monte deint
constantes relacionadas e depois não precise convertê-las aoint
usá-las.Obviamente, algumas das funcionalidades do tipo enum serão perdidas, mas, para armazenar um monte de constantes de identificação de banco de dados, parece uma solução bem organizada.
fonte
Isso analisa números inteiros ou seqüências de caracteres em uma enumeração de destino com correspondência parcial no dot.NET 4.0 usando genéricos como na classe de utilitário de Tawani acima. Estou usando-o para converter variáveis de opção da linha de comando que podem estar incompletas. Como uma enum não pode ser nula, você deve fornecer logicamente um valor padrão. Pode ser chamado assim:
Aqui está o código:
FYI: A pergunta era sobre números inteiros, que ninguém mencionado também converterá explicitamente em Enum.TryParse ()
fonte
Em uma sequência: (Enum.Parse está desatualizado, use Enum.TryParse)
fonte
A seguir é um método de extensão ligeiramente melhor
fonte
No meu caso, eu precisava retornar a enumeração de um serviço WCF. Eu também precisava de um nome amigável, não apenas o enum.ToString ().
Aqui está minha classe do WCF.
Aqui está o método Extension que obtém a Descrição do Enum.
Implementação:
fonte
Eu não sei mais de onde eu recebo a parte dessa extensão enum, mas é do stackoverflow. Desculpe-me por isto! Mas peguei este e modifiquei-o para enumerações com Flags. Para enums com Flags, fiz o seguinte:
Exemplo:
fonte
Você deve criar algum tipo de relaxamento correspondente para ser mais robusto.
Caso de teste
fonte
Diferentes maneiras de transmitir de e para
Enum
fonte
Pode ajudá-lo a converter qualquer dado de entrada na enumeração desejada pelo usuário . Suponha que você tenha um enum como abaixo do qual, por padrão, int . Adicione um valor padrão no início da sua enumeração. Que é usado no método de ajuda quando não há correspondência encontrada com o valor de entrada.
NB: Aqui eu tento analisar o valor em int, porque enum é por padrão int Se você definir enum como este, que é do tipo byte .
Você precisa alterar o método de análise no auxiliar de
para
byte.TryParse(value.ToString(), out tempType)
Verifico meu método para as seguintes entradas
Desculpe pelo meu Inglês
fonte
Aqui está um método de extensão que lança
Int32
aEnum
.Ele honra sinalizadores bit a bit, mesmo quando o valor é maior que o máximo possível. Por exemplo, se você tiver um enum com as possibilidades 1 , 2 e 4 , mas o int for 9 , ele entenderá como 1 na ausência de um 8 . Isso permite que você faça atualizações de dados antes das atualizações de código.
fonte
a maneira fácil e clara de converter um int enum em c #:
fonte
Você simplesmente usa a conversão explícita Cast int para enum ou enum para int
fonte
fonte
Você apenas faz como abaixo:
Para se certificar de que você apenas lança os valores corretos e pode gerar uma exceção caso contrário:
Observe que o uso de IsDefined é caro e ainda mais do que apenas a conversão, portanto, depende da sua implementação decidir usá-lo ou não.
fonte
Você pode usar o método de extensão.
use como código abaixo
enum:
Uso:
fonte