Eu tenho uma classe chamada Questions
(plural). Nesta classe, há um enum chamado Question
(singular) que se parece com isso.
public enum Question
{
Role = 2,
ProjectFunding = 3,
TotalEmployee = 4,
NumberOfServers = 5,
TopBusinessConcern = 6
}
Na Questions
classe, tenho uma get(int foo)
função que retorna um Questions
objeto para isso foo
. Existe uma maneira fácil de obter o valor inteiro da enumeração para que eu possa fazer algo assim Questions.Get(Question.Role)
?
get(int foo)
você pode defini-lo,get(Question foo)
assim como fazer sua fundição dentro do método, você pode chamá-lo comoQuestions.Get(Question.Role)
Respostas:
Basta lançar o enum, por exemplo
O exemplo acima funcionará para a grande maioria de enumerações que você vê na natureza, como o tipo subjacente padrão de uma enumeração
int
.No entanto, como cecilphillip aponta, as enumerações podem ter diferentes tipos subjacentes. Se um ENUM é declarado como um
uint
,long
ouulong
, deve ser convertido para o tipo de enumeração; por exemplo, paravocê deveria usar
fonte
enum Test { Item = 1 }
e ver que1 == (int)Test.Item
é igual.(int)Test.Item
Isso é um elenco! () é o operador de conversão explícita.enum Question
não foi,int
maslong
essa conversão truncaráRole
o valor integral de s!Enum
como parâmetro, sabe que é apenas um número fixo de possíveis valores integrais que você pode obter. Por outro lado, se você escolher simplesmente umint
, precisará validar se issoint
está dentro dos valores aceitos., Complicando o código. Você sempre pode substituir suas assinaturas como `` public void MyMethod (int x) {// faça algo com x} public void MyMethod (Enum x) {this.MyMethod ((int) x); } `` ``Desde Enums pode ser qualquer tipo integral (
byte
,int
,short
, etc.), uma forma mais robusta para obter o valor integral subjacente da enumeração seria fazer uso doGetTypeCode
método em conjunto com aConvert
classe:Isso deve funcionar independentemente do tipo integral subjacente.
fonte
var
é do tipoobject
, então você precisa retirá-lo da caixa e ele fica mais confuso do que eu gostaria.object val = Convert...etc
ovar
no seu exemplo sempre seráobject
.Declare-o como uma classe estática com constantes públicas:
E então você pode fazer referência a ele como
Question.Role
, e ele sempre é avaliado como umint
ou o que você definir como.fonte
static readonly int
porque constantes são compiladas em seus valores concretos. Veja stackoverflow.com/a/755693/492const
e nãostatic readonly
porque toda vez que você comparastatic readonly
você está fazendo uma chamada de método para obter o valor da variável, enquantoconst
você está comparando dois tipos de valor diretamente.compilation limitation
quero dizer que o valor é codificado quando você o compila, para que qualquer alteração nesse valor exija que todos os assemblies que o usem precisem ser recompilados. Estou inclinado a concordar com você sobre o uso, pois alterar os valores teria implicações de longo alcance.Irá resultar em
value == 2
.fonte
Em uma nota relacionada, se você deseja obter o
int
valorSystem.Enum
, especifiquee
aqui:Você pode usar:
Os dois últimos são feios. Eu prefiro o primeiro.
fonte
É mais fácil do que você pensa - um enum já é um int. Só precisa ser lembrado:
fonte
Exemplo:
E no código por trás para obter o valor enum:
ou
As enums serão incrementadas em 1 e você poderá definir o valor inicial. Se você não definir o valor inicial, ele será atribuído como 0 inicialmente.
fonte
1
emint
não ser que você definir explicitamente o contrárioRecentemente, converti o uso de enumerações no meu código em vez de usar classes com construtores protegidos e instâncias estáticas predefinidas (graças ao Roelof - C # Garantir valores válidos de enumeração - método à prova de futuro ).
À luz disso, veja abaixo como eu abordaria esse problema agora (incluindo a conversão implícita de / para
int
).A vantagem dessa abordagem é que você obtém tudo o que teria da enumeração, mas seu código agora é muito mais flexível; portanto, se você precisar executar ações diferentes com base no valor de
Question
, poderá colocar a lógica emQuestion
si (por exemplo, no OO preferido moda), em vez de colocar muitas instruções de caso em todo o código para lidar com cada cenário.NB: Resposta atualizada em 2018-04-27 para fazer uso dos recursos do C # 6; ou seja, expressões de declaração e definições de corpo de expressão lambda. Veja o histórico de revisões para obter o código original. Isso tem o benefício de tornar a definição um pouco menos detalhada; que havia sido uma das principais reclamações sobre a abordagem dessa resposta.
fonte
Se você deseja obter um número inteiro para o valor de enum que é armazenado em uma variável, para o qual o tipo seria
Question
, para usar, por exemplo, em um método, basta fazer isso que escrevi neste exemplo:Isso mudará o título da janela para 4, porque a variável
Geselecteerd
éTalen.Nederlands
. Se eu mudar paraTalen.Portugees
e chamar o método novamente, o texto será alterado para 3.fonte
Para garantir que exista um valor de enumeração e depois analisá-lo, você também pode fazer o seguinte.
fonte
Talvez eu tenha perdido, mas alguém já tentou um método simples de extensão genérica?
Isso funciona muito bem para mim. Você pode evitar o tipo de conversão na sua API dessa maneira, mas, em última análise, resulta em uma operação de tipo de alteração. Este é um bom caso para programar o Roslyn para que o compilador crie um método GetValue <T> para você.
fonte
Mais uma maneira de fazer isso:
Isso resultará em:
fonte
... é uma boa declaração.
Você precisa converter o resultado para int da seguinte maneira:
Caso contrário, o tipo é imóvel
QuestionType
.Esse nível de rigor é o modo C #.
Uma alternativa é usar uma declaração de classe:
É menos elegante declarar, mas você não precisa convertê-lo no código:
Como alternativa, você pode se sentir mais confortável com o Visual Basic, que atende a esse tipo de expectativa em muitas áreas.
fonte
number
deve ter o valor2
.fonte
bool
*,byte
,ushort
,int
, euint
**. O GetHashCode para outros tipos modifica o valor, por exemplo, alguns turnos de bits e xors. (* 1/0, ** convertido para int, é claro). Mas, no geral, não faça isso, a menos que seja seu próprio código privado.Você pode fazer isso implementando um método de extensão para o seu tipo de enum definido:
Isso simplifica a obtenção do valor int do valor atual da enumeração:
ou
fonte
Use um método de extensão:
E o uso é um pouco mais bonito:
fonte
fonte
Usar:
Isso resultará em
value == 2
.Isso só é verdade se o enum se encaixar dentro de um
int
.fonte
int
curso, poisGetHashCode
retorna um número inteiro.Como as enumerações podem ser declaradas com vários tipos primitivos, um método de extensão genérico para converter qualquer tipo de enumeração pode ser útil.
fonte
A seguir está o método de extensão
fonte
Meu hack favorito com enums int ou menores:
Para um enum
Este,
saídas
Aviso Legal:
Não funciona para enumerações baseadas em muito tempo.
fonte
A solução mais fácil que consigo pensar é sobrecarregar o
Get(int)
método desta maneira:onde
[modifiers]
geralmente pode ser o mesmo que para oGet(int)
método Se você não pode editar aQuestions
classe ou, por algum motivo, não quiser, pode sobrecarregar o método escrevendo uma extensão:fonte
O exemplo que eu gostaria de sugerir "para obter um valor 'int' de uma enumeração" é
Agora a resposta será 1.
fonte
Usar:
fonte
Tente este em vez de converter enum para int:
fonte
No Visual Basic, deve ser:
fonte
Eu vim com esse método de extensão que inclui recursos de idioma atuais. Ao usar dinâmico, não preciso fazer disso um método genérico e especificar o tipo que mantém a chamada mais simples e consistente:
fonte