web-dev-qa-db-fra.com

Comment représenter un enum dans une interface quand vous ne pouvez pas

Ok, donc la base de ce post et pour expliquer le titre est simple. J'ai une interface avec une méthode. Cette méthode côté utilisateur prendra une énumération en tant que paramètre. Mais vous ne pouvez pas définir des énumérations dans une interface, donc je ne vois pas comment je pourrais même définir cette méthode si j'attends un type Enum comme l'un des paramètres entrants.

Alors, comment gérez-vous cette situation? Comment pouvez-vous toujours obtenir cette méthode dans votre interface. Vous ne savez pas de quel type d'énum ils auront besoin d'être envoyés, mais vous savez bien que vous voulez que ce soit une énumération au lieu de chaînes magiques.

Un Enum n'est pas un type de référence, vous ne pouvez donc pas utiliser Object comme type pour le paramètre entrant. Donc, je ne sais pas quoi faire ici.

23
PositiveGuy
interface MyInterface
{
    void MyMethod(Enum @enum);
}
14
Yuriy Faktorovich
public enum MyEnum
{
  Hurr,
  Durr
}

public interface MyInterface
{
  void MyMethod(MyEnum value);
}

Si ce n'est pas ce dont vous parlez, laissez un commentaire afin que les gens puissent comprendre quel est votre problème. Parce que, si l’énumération n’est pas définie dans l’interface, il s’agit d’une conception tout à fait normale et acceptable.

27
Will

Une autre solution pourrait être d'utiliser des types génériques:

public enum MyEnum
{
    Foo,
    Bar
}

public interface IDummy<EnumType>
{
    void OneMethod(EnumType enumVar);
}

public class Dummy : IDummy<MyEnum>
{
    public void OneMethod(MyEnum enumVar)
    {
        // Your code
    }
}

De plus, depuis C # 7.3, vous pouvez ajouter une contrainte générique pour accepter uniquement les types Enum:

public interface IDummy<EnumType> : where EnumType : Enum
{
    void OneMethod(EnumType enumVar);
}
1
Samuel LIOULT

Si vous parlez d'interfaces génériques et du fait que C # ne vous permet pas de contraindre les types génériques à être des énumérations, la réponse à cette question inclut deux solutions de contournement différentes.

0
Joel Mueller

Définir une énumération revient à définir une classe ou une interface. Vous pouvez simplement le placer dans l'un de vos fichiers de classe, à l'intérieur de l'espace de noms mais en dehors de la définition de classe, mais si plusieurs classes l'utilisent, dans laquelle vous l'insérez, et quel que soit votre choix, vous obtiendrez "Le nom du type ne correspond pas au fichier nommer "avertissements. La "bonne" façon de le faire est donc de le placer dans son propre fichier, comme vous le feriez avec une classe ou une interface:

MyEnum.cs

namespace MyNamespace { internal enum MyEnum { Value1, Value2, Value3, Value4, Value5 }; } Toutes les interfaces ou classes de l'espace de noms peuvent alors y accéder.

0
Dave