Je suis en train de mettre en œuvre actuellement un associociacion de chaînes et d'enums basé sur cette suggestion . Cet étant, j'ai un J'ai essayé description code> associé à chaque élément Enum. Sur cette page, il existe également une fonction qui renvoie la chaîne de la description en fonction de l'énumé donné. Ce que je voudrais implémenter maintenant, c'est la fonction inverse, c'est-à-dire que, étant donné une chaîne d'entrée, lookez l'ENUM avec la description correspondante si elle existe, renvoyant null sinon. P>
(t) Enum.parse (typeof (t), "testtring") code> mais il jette une exception. P>
5 Réponses :
[Fact] public void Can_parse_a_value_with_a_description_to_an_enum() { string description = "First Value"; SomeEnum value = ParseDescriptionToEnum<SomeEnum>(description); Assert.Equal(SomeEnum.FirstValue, value); } [Fact] public void Can_parse_a_value_without_a_description_to_an_enum() { string description = "SecondValue"; SomeEnum value = ParseDescriptionToEnum<SomeEnum>(description); Assert.Equal(SomeEnum.SecondValue, value); }
Vous devez écrire votre propre méthode inverse. La méthode du stock parse () ne connaît évidemment pas vos attributs de description.
Quelque chose comme ça devrait fonctionner: p>
public static T GetEnumValueFromDescription<T>(string description) { MemberInfo[] fis = typeof(T).GetFields(); foreach (var fi in fis) { DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false); if (attributes != null && attributes.Length > 0 && attributes[0].Description == description) return (T)Enum.Parse(typeof(T), fi.Name); } throw new Exception("Not found"); }
Grande solution! Au lieu de jeter une exception, je suis allé avec la défaillance de l'analyse enum par défaut. Cela couvre le scénario où vous n'avez peut-être pas d'attribut de description sur chaque option dans une énumération.
Cela n'a pas fonctionné pour moi. Dû faire quelques changements. Le code ci-dessous est de l'intérieur du pour chacun. J'espère que cela aide quelqu'un :) var attributs = fi.customattributes; Si (attributs! = null && attributs.count ()> 0 && (String ).First (). Namedarguments.First (). TypedValue .Value == Description) Retour (int) Enum.parse (Typeof (Tenum) , nom);
J'aurais évoqué la réponse d'Anna, mais je n'ai pas la réputation de le faire. En partie, en fonction de sa réponse, voici une solution à 2 voies que j'ai proposée. Fourniture d'une méthode par défaut à Paysenum couvre les cas où le même énorme peut avoir une valeur par défaut différente basée sur son utilisation.
public static string GetDescription<T>(this object enumerationValue) where T : struct { // throw an exception if enumerationValue is not an Enum Type type = enumerationValue.GetType(); if (!type.IsEnum) { throw new ArgumentException("EnumerationValue must be of Enum type", "enumerationValue"); } //Tries to find a DescriptionAttribute for a potential friendly name for the enum MemberInfo[] memberInfo = type.GetMember(enumerationValue.ToString()); if (memberInfo != null && memberInfo.Length > 0) { DescriptionAttribute[] attributes = (DescriptionAttribute[])memberInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false); if (attributes != null && attributes.Length > 0) { //Pull out the description value return attributes[0].Description; } } //In case we have no description attribute, we'll just return the ToString of the enum return enumerationValue.ToString(); } public static T ParseEnum<T>(this string stringValue, T defaultValue) { // throw an exception if T is not an Enum Type type = typeof(T); if (!type.IsEnum) { throw new ArgumentException("T must be of Enum type", "T"); } //Tries to find a DescriptionAttribute for a potential friendly name for the enum MemberInfo[] fields = type.GetFields(); foreach (var field in fields) { DescriptionAttribute[] attributes = (DescriptionAttribute[])field.GetCustomAttributes(typeof(DescriptionAttribute), false); if (attributes != null && attributes.Length > 0 && attributes[0].Description == stringValue) { return (T)Enum.Parse(typeof(T), field.Name); } } //In case we couldn't find a matching description attribute, we'll just return the defaultValue that we provided return defaultValue; }
Vous pouvez également utiliser Humanizer pour cela. Pour obtenir la description, vous écrivez:
"UCAL1".DehumanizeTo<EAssemblyUnit>();
Dupliqué possible de Pouvez-vous accéder à une longue description pour une valeur spécifique enum.