web-dev-qa-db-fra.com

Méthodes inside enum en C #

En Java, il est possible d'avoir des méthodes dans une énumération.

Existe-t-il une telle possibilité en C # ou s'agit-il simplement d'une collection de chaînes et c'est tout?

J'ai essayé de surcharger ToString() mais cela ne compile pas. Est-ce que quelqu'un a un exemple de code simple?

129
Eya

Vous pouvez écrire méthodes d'extension pour les types enum:

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();
    }
}
225
MarkPflug

Vous pouvez écrire une méthode d'extension pour votre enum:

Comment: créer une nouvelle méthode pour une énumération (Guide de programmation C #)

18
Jay Riggs

Une autre option consiste à utiliser le Classe d'énumération créé par Jimmy Bogard .

Fondamentalement, vous devez créer une classe qui hérite de son Enumeration. Exemple:

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}!";
    }
}

Ensuite, vous pouvez l'utiliser comme une énumération, avec la possibilité d'y insérer des méthodes (entre autres):

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

Vous pouvez le télécharger avec NuGet .

Bien que cette implémentation ne soit pas native dans le langage, la syntaxe (construction et utilisation) est assez proche des langages qui implémentent des énums nativement meilleurs que C # ( Kotlin par exemple).

9
fabriciorissetto

Nan. Vous pouvez créer une classe, puis ajouter un tas de propriétés à la classe pour n pe émuler une énumération, mais c'est pas vraiment la même chose.

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.
    }
}

Un meilleur modèle serait de mettre vos méthodes dans une classe distincte de votre emum.

3
Kyle Trauberman

Depuis que je suis tombé sur le problème et que j'ai eu besoin de l'opposé d'enum to string, voici une solution générique:

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

Cela ignore également le cas et est très pratique pour analyser REST-Response à votre enum afin d’obtenir plus de sécurité. Espérons que cela aide quelqu'un

0
scrat84