Métodos dentro de enum em C #

165

Em Java, é possível ter métodos dentro de uma enumeração.

Existe essa possibilidade em C # ou é apenas uma coleção de cadeias e é isso?

Tentei substituir, ToString()mas ele não é compilado. Alguém tem um exemplo de código simples?

Eya
fonte
Eu não acho que você pode ter métodos dentro de um Enum em c #. O que você está tentando fazer?
Duncan Howe
tentando obter o comportamento Java e encapsular lógica estreita ao Enums. de qualquer maneira, vejo pelas respostas que não é possível - implementarei extensões.
Eya

Respostas:

272

Você pode escrever métodos de extensão para tipos de enumeração:

enum Stuff
{
    Thing1,
    Thing2
}

static class StuffMethods
{

    public static String GetString(this Stuff s1)
    {
        switch (s1)
        {
            case Stuff.Thing1:
                return "Yeah!";
            case Stuff.Thing2:
                return "Okay!";
            default:
                return "What?!";
        }
    }
}

class Program
{


    static void Main(string[] args)
    {
        Stuff thing = Stuff.Thing1;
        String str = thing.GetString();
    }
}
MarkPflug
fonte
11

Outra opção é usar a classe de enumeração criada por Jimmy Bogard .

Basicamente, você deve criar uma classe que herda dele Enumeration. Exemplo:

public class EmployeeType : Enumeration
{
    public static readonly EmployeeType Manager 
        = new EmployeeType(0, "Manager");
    public static readonly EmployeeType Servant 
        = new EmployeeType(1, "Servant");
    public static readonly EmployeeType Assistant
        = new EmployeeType(2, "Assistant to the Regional Manager");

    private EmployeeType() { }
    private EmployeeType(int value, string displayName) : base(value, displayName) { }

    // Your method...
    public override string ToString()
    {
        return $"{value} - {displayName}!";
    }
}

Então você pode usá-lo como um enum, com a possibilidade de colocar métodos dentro dele (entre outras coisas):

EmployeeType.Manager.ToString();
//0 - Manager
EmployeeType.Servant.ToString();
//1 - Servant
EmployeeType.Assistant.ToString();
//2 - Assistant to the Regional Manager

Você pode baixá-lo com o NuGet .

Embora essa implementação não seja nativa no idioma, a sintaxe (construção e uso) é bastante próxima dos idiomas que implementam enumerações nativamente melhores que o C # ( Kotlin, por exemplo).

fabriciorissetto
fonte
3

Não. Você pode criar uma classe, em seguida, adicionar um monte de propriedades para a classe um pouco emular um enum, mas isso não é realmente a mesma coisa .

class MyClass
{
    public string MyString1 { get{ return "one";} }
    public string MyString2 { get{ return "two";} }
    public string MyString3 { get{ return "three";} }

    public void MyMethod()
    {
        // do something.
    }
}

Um padrão melhor seria colocar seus métodos em uma classe separada do seu emum.

Kyle Trauberman
fonte
0

Desde que me deparei, e precisava exatamente o oposto de enum para string, aqui está uma solução genérica:

static class EnumExtensions {
    public static T GetEnum<T>(this string itemName) {
        return (T) Enum.Parse(typeof(T), itemName, true);
    }
}

Isso também ignora maiúsculas e minúsculas e é muito útil para analisar a resposta REST da sua enumeração para obter mais segurança de tipo. Espero que ajude alguém

scrat84
fonte
-15

C # Não permite o uso de métodos em enumeradores, pois não é um princípio baseado em classe, mas sim uma matriz bidimensional com uma string e um valor.

O uso de classes é altamente desencorajado pela Microsoft, nesse caso, use struct (dados) (ures); O STRUCT foi concebido como uma classe leve para dados e seus manipuladores e pode lidar com funções muito bem. O C # e seu compilador não possuem os recursos de rastreamento e eficiência, como se conhece no JAVA, onde quanto mais vezes uma determinada classe / método é usada, mais rapidamente ela é executada e seu uso se torna 'antecipado'. O C # simplesmente não possui isso; portanto, para diferenciar, use STRUCT em vez de CLASS.

user236800
fonte
7
Sete votos negativos sem um único comentário para explicar o que deveria estar errado com esta resposta? Vamos lá pessoal ...
Good Night Nerd Pride
As informações fornecidas nesta publicação estão erradas?
VK
5
Esta parte é verdadeira: C # Não permite o uso de métodos em enumeradores. Não tenho certeza se o raciocínio está correto e o segundo parágrafo parece completamente irrelevante para a pergunta. Se houver uma maneira de usar uma estrutura para simular uma enumeração com comportamento, fornecer um exemplo seria o melhor.
Mishelle #
3
Eu acho que as implicações são bastante claras aqui. Não substitua um enum (que é um tipo de valor) por uma classe (que é um tipo de referência) apenas para adicionar métodos, pois as estruturas também podem ter métodos e também são tipos de valor.
28417 smelch