Vous ne pouvez pas affecter une valeur d'enum à une chaîne de commencer avec. Vous devez appeler ToString()
, ce qui permettrait de convertir Country.UnitedKingdom
de "royaume-uni".
Deux options se dégagent:
- Créer un
Dictionary<Country, string>
- Une instruction switch
- Décorer chaque valeur à un attribut, et de la charge qu'avec réflexion
Commentaires à propos de chacun d'eux...
Exemple de code pour l' Dictionary<Country,string>
using System;
using System.Collections.Generic;
enum Country
{
UnitedKingdom,
UnitedStates,
France,
Portugal
}
class Test
{
static readonly Dictionary<Country, string> CountryNames =
new Dictionary<Country, string>
{
{ Country.UnitedKingdom, "UK" },
{ Country.UnitedStates, "US" },
};
static string ConvertCountry(Country country)
{
string name;
return (CountryNames.TryGetValue(country, out name))
? name : country.ToString();
}
static void Main()
{
Console.WriteLine(ConvertCountry(Country.UnitedKingdom));
Console.WriteLine(ConvertCountry(Country.UnitedStates));
Console.WriteLine(ConvertCountry(Country.France));
}
}
Vous pourriez mettre la logique de l' ConvertCountry
dans une méthode d'extension. Par exemple:
// Put this in a non-nested static class
public static string ToBriefName(this Country country)
{
string name;
return (CountryNames.TryGetValue(country, out name))
? name : country.ToString();
}
Ensuite, vous pouvez écrire:
string x = Country.UnitedKingdom.ToBriefName();
Comme mentionné dans les commentaires, le dictionnaire par défaut comparer impliquera de boxe, qui est non-idéal. Pour un one-off, je voudrais vivre avec ça jusqu'à ce que j'ai trouvé que c'était un goulot d'étranglement. Si je faisais cela pour de multiples enums, allais-je écrire une classe réutilisable.
Instruction Switch
Je suis d'accord avec yshuditelu de répondre, en suggérant à l'aide d'un switch
déclaration pour les cas relativement rares. Cependant, chaque cas est une seule déclaration, je serais personnellement changer mon style de codage de cette situation, pour avoir un code compact, mais lisible:
public static string ToBriefName(this Country country)
{
switch (country)
{
case Country.UnitedKingdom: return "UK";
case Country.UnitedStates: return "US";
default: return country.ToString();
}
}
Vous pouvez ajouter plus de cas de ce sans faire de trop grands, et il est facile de jeter les yeux en face de la valeur d'énumération à la valeur de retour.
DescriptionAttribute
Le point de Rado fait sur le code pour DescriptionAttribute
il est réutilisable est une bonne idée, mais dans ce cas, je vous recommande contre l'utilisation de la réflexion à chaque fois que vous avez besoin pour obtenir une valeur. J'écrirais probablement un générique classe statique pour tenir une table de recherche (probablement un Dictionary
, éventuellement avec un comparateur comme mentionné dans les commentaires). Les méthodes d'Extension ne peuvent pas être définies dans des classes génériques, de sorte que vous auriez probablement quelque chose comme:
public static class EnumExtensions
{
public static string ToDescription<T>(this T value) where T : struct
{
return DescriptionLookup<T>.GetDescription(value);
}
private static class DescriptionLookup<T> where T : struct
{
static readonly Dictionary<T, string> Descriptions;
static DescriptionLookup()
{
// Initialize Descriptions here, and probably check
// that T is an enum
}