Eu tenho um enum de, por exemplo, ' Gender
' ( Male =0 , Female =1
) e tenho outro enum de um serviço que tem seu próprio enum de gênero ( Male =0 , Female =1, Unknown =2
)
Minha pergunta é como posso escrever algo rápido e agradável para converter de seu enum para o meu?
Respostas:
Usar um método de extensão funciona perfeitamente, ao usar os dois métodos de conversão sugeridos por Nate:
Obviamente, não há necessidade de usar classes separadas se você não quiser. Minha preferência é manter os métodos de extensão agrupados pelas classes / estruturas / enumerações às quais se aplicam.
fonte
Dado
Enum1 value = ...
, então, se você quer dizer por nome:Se você quer dizer com valor numérico, geralmente pode apenas lançar:
(com o elenco, você pode querer usar
Enum.IsDefined
para verificar os valores válidos, no entanto)fonte
Enum.Tryparse
:Enum2 value2 = Enum.TryParse(value.ToString(), out Enum2 outValue) ? outValue : Enum2.Unknown;
Isso permitirá que você manipule os valores de entrada que não existemEnum2
sem a necessidade de chamarEnum.IsDefined
ou capturar osArgumentException
s lançados porEnum.Parse
. Observe que a ordem dos parâmetros é mais ou menos invertidaEnum.Parse
.Basta converter um para int e, em seguida, convertê-lo para o outro enum (considerando que você deseja que o mapeamento seja feito com base no valor):
fonte
long
(ouulong
) em vez de umint
que tem membros definidos que estão acimaint.MaxValue
(ou abaixoint.MinValue
), caso em que a conversão paraint
poderia estourar e você acabaria com um valor enum indefinido que deve ser definido.Para ser mais completo, normalmente crio um par de funções, uma que leva Enum 1 e retorna Enum 2 e outra que leva Enum 2 e retorna Enum 1. Cada uma consiste em uma instrução de caso que mapeia entradas para saídas e o caso padrão lança uma exceção com um mensagem reclamando de um valor inesperado.
Neste caso específico, você pode tirar vantagem do fato de que os valores inteiros de Masculino e Feminino são os mesmos, mas eu evitaria isso, pois é hackeado e sujeito a quebras se qualquer enum mudar no futuro.
fonte
Se tiver-mos:
e
Podemos fazer com segurança
Ou mesmo
Se você quiser cobrir o caso em que um enum no lado direito do sinal '=' tem mais valores do que o enum no lado esquerdo - você terá que escrever seu próprio método / dicionário para cobrir isso como outros sugeriram.
fonte
Você poderia escrever um método de extensão genérico simples como este
fonte
você pode escrever uma função simples como a seguinte:
fonte
Aqui está uma versão do método de extensão se alguém estiver interessado
fonte
fonte
Eu escrevi métodos de extensão de conjunto um tempo atrás que funcionam para vários tipos diferentes de programas
Enum
. Um em particular funciona para o que você está tentando realizar e lidaEnum
com s com osFlagsAttribute
, bem comoEnum
com diferentes tipos subjacentes.A partir daí, você pode adicionar outros métodos de extensão mais específicos.
Este mudará os tipos de
Enum
s como você está tentando fazer.Esteja avisado, porém, que você PODE converter entre qualquer
Enum
e qualquer outroEnum
usando este método, mesmo aqueles que não têm sinalizadores. Por exemplo:A variável
turtle
terá um valor deTurtle.Blue
.No entanto, há segurança de
Enum
valores indefinidos usando este método. Por exemplo:Nesse caso,
access
será definido comoWriteAccess.ReadWrite
, poisWriteAccess
Enum
tem um valor máximo de 3.Outro efeito colateral de misturar
Enum
s comFlagsAttribute
e sem ele é que o processo de conversão não resultará em uma correspondência de 1 para 1 entre seus valores.Nesse caso,
letters
terá um valor de emLetters.H
vez deLetters.D
, visto que o valor de apoio deFlavors.Peach
é 8. Além disso, uma conversão deFlavors.Cherry | Flavors.Grape
paraLetters
resultariaLetters.C
, o que pode parecer não intuitivo.fonte
Com base na resposta de Justin acima, eu vim com o seguinte:
fonte
Eu sei que essa é uma pergunta antiga e tenho muitas respostas. No entanto, acho que usar uma instrução switch como a resposta aceita é um pouco complicado, então aqui estão meus 2 centavos:
Meu método favorito é usar um dicionário, onde a chave é o enum de origem e o valor é o enum de destino - portanto, no caso apresentado na pergunta, meu código seria assim:
Claro, isso pode ser empacotado em uma classe estática e usado como um método de extensão:
fonte
Você pode usar ToString () para converter o primeiro enum em seu nome e, em seguida, Enum.Parse () para converter a string de volta no outro Enum. Isso lançará uma exceção se o valor não for compatível com o enum de destino (ou seja, para um valor "Desconhecido")
fonte