Minha enum consiste nos seguintes valores:
private enum PublishStatusses{
NotCompleted,
Completed,
Error
};
Eu quero ser capaz de gerar esses valores de uma maneira amigável ao usuário.
Não preciso ser capaz de passar da string para o valor novamente.
Respostas:
Eu uso o
Description
atributo do espaço para nome System.ComponentModel. Simplesmente decore a enum:Em seguida, use este código para recuperá-lo:
fonte
ArgumentException
, então não há nenhuma razão para que o método seja completamente genérico.Eu faço isso com métodos de extensão:
fonte
default
implementação de caso retorneme.ToString()
e forneça apenas instruções de caso de opção para os valores de enumeração que você deseja substituir. No seu exemplo, entendo que todos são diferentes, mas, nos casos de uso reais, suspeito que a maioria dos valores de enum de palavra única será suficiente e você fornecerá apenas substituições para valores de enum de várias palavras.Talvez esteja faltando alguma coisa, mas o que há de errado com o Enum.GetName?
edit: para strings amigáveis, você precisa passar por um .resource para concluir a internacionalização / localização, e seria melhor usar uma chave fixa com base na chave enum do que um atributo decorador na mesma.
fonte
Eu criei um método de extensão reversa para converter a descrição novamente em um valor enum:
fonte
A solução mais fácil aqui é usar um método de extensão personalizado (pelo menos no .NET 3.5 - você pode apenas convertê-lo em um método auxiliar estático para versões anteriores da estrutura).
Estou assumindo aqui que você deseja retornar algo diferente do nome real do valor da enumeração (que você pode obter simplesmente chamando ToString).
fonte
Esse outro post é Java. Você não pode colocar métodos em enums em c #.
basta fazer algo assim:
Se você deseja usar valores de exibição diferentes para seus valores de enumeração, use Atributos e Reflexão.
fonte
A maneira mais simples é incluir essa classe de extensão em seu projeto, ela funcionará com qualquer enumeração no projeto:
Uso:
...
fonte
string result = "Result: " + ee;
Algumas outras opções mais primitivas que evitam classes / tipos de referência:
Método de matriz
Uso
Método struct aninhado
Uso
Atualização (09/09/2018)
Um híbrido de métodos de extensão e a primeira técnica acima.
Prefiro enums a serem definidos onde eles "pertencem" (o mais próximo à fonte de origem e não em algum espaço de nomes global comum).
O método de extensão parece adequado para uma área comum, e a definição "localizada" do enum agora torna o método de extensão mais detalhado.
Um exemplo de uso da enumeração e seu método de extensão.
Nota: Decidi eliminar o
Enum
wrapper (e aName
matriz), já que é melhor que as cadeias de nomes venham de um recurso (ou seja, arquivo de configuração ou banco de dados), em vez de serem codificadas, e porque acabei colocando o método de extensão noViewModels
namespace (apenas em um arquivo "CommonVM.cs" diferente). Além disso, a.Id
coisa toda se torna perturbadora e complicada.CommonVM.cs
Um exemplo de uso da enumeração e seu método de extensão.
fonte
Você pode usar Humanizer pacote com humanizar Enums possibilidade. Um exemplo:
então você pode usar o
Humanize
método de extensão no enum diretamente:fonte
Com relação a Ray Booysen, há um erro no código: Enum ToString com strings amigáveis
Você precisa levar em consideração vários atributos nos valores da enumeração.
fonte
fonte
this
parâmetro nos métodos de extensão, que você pode ver chamadoThis
em muitos exemplos na web. Chamá-lo como seu tipo, como você fez (Enum Enum
), torna o código menos legível.Em vez de usar um enum, use uma classe estática.
substituir
com
será usado assim
Problema usando as principais soluções "método de extensão":
Um enum privado é frequentemente usado dentro de outra classe. A solução do método de extensão não é válida lá, pois deve estar em sua própria classe. Esta solução pode ser privada e incorporada em outra classe.
fonte
Por acaso, sou fã do VB.NET, então aqui está minha versão, combinando o método DescriptionAttribute com um método de extensão. Primeiro, os resultados:
Coisas básicas: uma enumeração chamada EnumType com três valores V1, V2 e V3. A "mágica" acontece na chamada Console.WriteLine em Sub Main (), onde o último argumento é simples
v.Description
. Isso retorna "Um" para V1, "V2" para V2 e "Três" para V3. Este método de descrição é de fato um método de extensão, definido em outro módulo chamado EnumExtensions:Como a pesquisa de atributos de descrição
Reflection
é lenta, as pesquisas também são armazenadas em cache de forma privadaDictionary
, preenchida por demanda.(Desculpe pela solução VB.NET - deve ser relativamente simples traduzi-la para C # e meu C # está enferrujado em novos assuntos, como extensões)
fonte
Resumo limpo das sugestões acima com amostra:
USO:
fonte
Use Enum.GetName
No link acima ...
fonte
De acordo com esta documentação: https://docs.microsoft.com/pt-br/dotnet/api/system.enum.tostring?view=netframework-4.8
É possível apenas converter um enumerador em string usando um formato como este:
Você pode ver todos os formatos possíveis neste link: https://docs.microsoft.com/pt-br/dotnet/api/system.string?view=netframework-4.8
fonte
Esta é uma atualização do código de Ray Booysen que usa o método GetCustomAttributes genérico e o LINQ para tornar as coisas um pouco mais organizadas.
fonte
Resumo ainda mais limpo:
O mesmo uso que o sublinhado descreve.
fonte
Para sinalizadores enum incluindo.
fonte
Caso você queira apenas adicionar um espaço em branco entre as palavras, é tão simples quanto
fonte
Eu uso uma classe genérica para armazenar os pares enum / description e uma classe auxiliar aninhada para obter a descrição.
O enum :
A classe genérica:
Nota: Como uma classe genérica não pode ser restringida por uma enumeração , estou restringindo por struct e verificando a enumeração no construtor.
Uso:
fonte
Eu acho que a melhor (e mais fácil) maneira de resolver seu problema é escrever um método de extensão para sua enumeração:
fonte
Se você quiser algo completamente personalizável, experimente minha solução aqui:
http://www.kevinwilliampang.com/post/Mapping-Enums-To-Strings-and-Strings-to-Enums-in-NET.aspx
Basicamente, a postagem descreve como anexar atributos de Descrição a cada uma de suas enumerações e fornece uma maneira genérica de mapear de enumeração para descrição.
fonte