En essayant d'analyser un drapeau enum à chaîne
J'ai une classe "licence" qui est une collection de tout un tas d'enum drapeaux comme ceci:
Public class License
{
UsageType Usage { get; set; }
PlatformType Platform { get; set; }
public enum UsageType { read = 1, write = 2, wipe = 4, all = 7 }
public enum PlatformType { windows = 1, linux = 2, ios = 4, all = 7 }
etc...
}
Le point est que les différents indicateurs de la même catégorie peuvent être OU avais-les ensemble pour former un profil de ce que l'utilisateur peut faire avec de ladite licence. Maintenant, je vais essayer d'afficher les valeurs de "l'Utilisation" et "Plate-forme" de l'homme de manière conviviale ainsi, si par exemple l'Utilisation de == UsageType.lecture | UsageType.écrire alors il doit être analysé à "lire, écrire".
Je l'ai fait avec succès avec un seul type enum en testant la valeur de chaque indicateur, et en ajoutant enumitem.ToString() pour chaque indicateur, il a une chaîne de caractères. Depuis j'ai beaucoup de ces énumérations et des valeurs bien, j'aimerais venir avec une approche plus générique.
Je suis venu avec ce (ci-dessous), mais depuis que je ne suis pas très familier avec le modèle des fonctions en c# donc je ne sais pas pourquoi cela ne fonctionne pas, mais au moins, il doit illustrer ce que je veux dire:
private string parseEnum<T>(T value)
{
string ret = "";
foreach (var ei in (T[])Enum.GetValues(typeof(T)))
{
if (value.HasFlag(ei)) ret += ei.ToString() + ", ";
}
ret = ret.substring(0, ret.Length-1);
return ret;
}
C'est dire que T ne contient pas une définition pour "HasFlag" mais comment pourrait-il maintenant que si il ne sait pas ce que T est?
- Pas exactement un doublon, mais le problème de la vous êtes rencontre est essentiellement ceci: stackoverflow.com/questions/79126/.... La solution apportée à cette question devrait vous obtenir où vous devez être.
- msdn.microsoft.com/en-us/library/... ou stackoverflow.com/questions/8447/...
- Avez-vous essayé
enumValue.ToString()
? - Si vous utilisez le
Flags
l'attribut sur votre énumération, vous faire belle impression (qui répertorie chaque composante indicateur défini) pour gratuit. - En aparté,
string.Join
c'est une bonne méthode pour prévenir laid chaîne de renforcement des boucles.
Vous devez vous connecter pour publier un commentaire.
Vous devez utiliser le
FlagsAttribute
, ce qui provoque le haut-ToString
etEnum.Parse
méthodes de travail comme vous le souhaitez. Notez également que la convention est que les drapeaux enum noms devrait être au pluriel, si par exemple laUsageTypes
au lieu deUsageType
.