Comment définir un enum avec une valeur de chaîne?

J’essaie de définir un Enum et d’append des séparateurs communs valides utilisés dans CSV ou des fichiers similaires. Ensuite, je vais le lier à un ComboBox tant que source de données, donc à chaque fois que j’appendai ou que je retirerez de la définition Enum, je n’aurai pas besoin de changer quoi que ce soit dans la liste déroulante.

Le problème est de savoir comment définir enum avec une représentation sous forme de chaîne, quelque chose comme:

public enum SeparatorChars{Comma = ",", Tab = "\t", Space = " "}

Vous ne pouvez pas – les valeurs enum doivent être des valeurs intégrales. Vous pouvez soit utiliser des atsortingbuts pour associer une valeur de chaîne à chaque valeur d’énumération, soit dans ce cas si chaque séparateur est un caractère unique, vous pouvez simplement utiliser la valeur de caractère:

 enum Separator { Comma = ',', Tab = '\t', Space = ' ' } 

(EDIT: Juste pour clarifier, vous ne pouvez pas créer le type sous-jacent de l’énumération, mais vous pouvez utiliser des constantes de caractères pour affecter la valeur intégrale correspondant à chaque valeur d’énum. Le type sous-jacent de l’énumération ci-dessus est int .)

Ensuite, une méthode d’extension si vous en avez besoin:

 public ssortingng ToSeparatorSsortingng(this Separator separator) { // TODO: validation return ((char) separator).ToSsortingng(); } 

Autant que je sache, vous ne serez pas autorisé à atsortingbuer des valeurs de chaîne à enum. Ce que vous pouvez faire, c’est créer une classe avec des constantes de chaîne.

 public static class SeparatorChars { public static Ssortingng Comma { get { return ",";} } public static Ssortingng Tab { get { return "\t,";} } public static Ssortingng Space { get { return " ";} } } 

Vous pouvez y arriver, mais vous aurez besoin de peu de travail.

  1. Définissez une classe d’atsortingbut qui contiendra la valeur de chaîne pour enum.
  2. Définissez une méthode d’extension qui renverra la valeur de l’atsortingbut. Eg..GetSsortingngValue (cette valeur Enum) renverra une valeur d’atsortingbut.
  3. Ensuite, vous pouvez définir l’énumération comme ceci ..
 Énumération publique Test: int {
     [SsortingngValue ("a")]
     Foo = 1,
     [SsortingngValue ("b")]
     Quelque chose = 2        
 } 
  1. Pour récupérer la valeur de Atsortingnbute Test.Foo.GetSsortingngValue ();

Refer: Enum With Ssortingng Values ​​In C #

Vous ne pouvez pas faire cela avec des énumérations, mais vous pouvez le faire comme ça:

 public static class SeparatorChars { public static ssortingng Comma = ","; public static ssortingng Tab = "\t"; public static ssortingng Space = " "; } 

Pour un enum simple de valeurs de chaîne (ou tout autre type):

 public static class MyEnumClass { public const ssortingng MyValue1 = "My value 1", MyValue2 = "My value 2"; } 

Utilisation: ssortingng MyValue = MyEnumClass.MyValue1;

Vous ne pouvez pas, car enum ne peut être basé que sur un type numérique primitif. Vous pouvez essayer d’utiliser un Dictionary place:

 Dictionary separators = new Dictionary { {"Comma", ','}, {"Tab", '\t'}, {"Space", ' '}, }; 

Vous pouvez également utiliser un Dictionary ou DictionarySeparator est un enum normal:

 enum Separator { Comma, Tab, Space } 

ce qui serait un peu plus agréable que de manipuler directement les cordes.

Eh bien d’abord, vous essayez d’atsortingbuer des chaînes, pas des caractères, même si elles ne sont qu’un seul caractère. utilisez ‘,’ au lieu de “,”. La prochaine chose est, les énumérations ne prennent que les types intégraux sans caractère, vous pouvez utiliser la valeur unicode, mais je vous conseille vivement de ne pas le faire. Si vous êtes certain que ces valeurs restnt les mêmes, dans différentes cultures et langages, j’utiliserais une classe statique avec des chaînes const.

Bien qu’il ne soit vraiment pas possible d’utiliser un caractère ou une ssortingng comme base pour une énumération, je pense que ce n’est pas ce que vous aimez vraiment faire.

Comme vous l’avez mentionné, vous aimeriez avoir une liste de possibilités et afficher une représentation sous forme de chaîne dans une combo. Si l’utilisateur sélectionne l’une de ces représentations de chaîne, vous souhaitez extraire l’énumération correspondante. Et c’est possible:

Nous devons d’abord relier une chaîne à une valeur enum. Cela peut être fait en utilisant le DescriptionAtsortingbute comme il est décrit ici ou ici .

Vous devez maintenant créer une liste des valeurs énumérées et des descriptions correspondantes. Cela peut être fait en utilisant la méthode suivante:

 ///  /// Creates an List with all keys and values of a given Enum class ///  /// Must be derived from class Enum! /// A list of KeyValuePair<Enum, ssortingng> with all available /// names and values of the given Enum. public static IList> ToList() where T : struct { var type = typeof(T); if (!type.IsEnum) { throw new ArgumentException("T must be an enum"); } return (IList>) Enum.GetValues(type) .OfType() .Select(e => { var asEnum = (Enum)Convert.ChangeType(e, typeof(Enum)); return new KeyValuePair(e, asEnum.Description()); }) .ToArray(); } 

Vous allez maintenant avoir une liste de paires de valeurs clés de toutes les énumérations et leur description. Atsortingbuons simplement ceci comme source de données pour une combo.

 var comboBox = new ComboBox(); comboBox.ValueMember = "Key" comboBox.DisplayMember = "Value"; comboBox.DataSource = EnumUtilities.ToList(); comboBox.SelectedIndexChanged += (sender, e) => { var selectedEnum = (Separator)comboBox.SelectedValue; MessageBox.Show(selectedEnum.ToSsortingng()); } 

L’utilisateur voit toutes les représentations de chaîne de l’énumération et dans votre code, vous obtiendrez la valeur enum souhaitée.

Une classe qui émule le comportement enum mais en utilisant ssortingng au lieu de int peut être créée comme suit …

 public class GrainType { private ssortingng _typeKeyWord; private GrainType(ssortingng typeKeyWord) { _typeKeyWord = typeKeyWord; } public override ssortingng ToSsortingng() { return _typeKeyWord; } public static GrainType Wheat = new GrainType("GT_WHEAT"); public static GrainType Corn = new GrainType("GT_CORN"); public static GrainType Rice = new GrainType("GT_RICE"); public static GrainType Barley = new GrainType("GT_BARLEY"); } 

Usage…

 GrainType myGrain = GrainType.Wheat; PrintGrainKeyword(myGrain); 

puis…

 public void PrintGrainKeyword(GrainType grain) { Console.Writeline("My Grain code is " + grain.ToSsortingng()); // Displays "My Grain code is GT_WHEAT" } 

Il est un peu tard pour répondre, mais peut-être aidera-t-il quelqu’un à l’avenir. J’ai trouvé plus facile d’utiliser struct pour ce type de problème.

L’échantillon suivant est une partie copiée du code MS:

 namespace System.IdentityModel.Tokens.Jwt { // // Summary: // List of registered claims from different sources http://tools.ietf.org/html/rfc7519#section-4 // http://openid.net/specs/openid-connect-core-1_0.html#IDToken public struct JwtRegisteredClaimNames { // // Summary: // http://tools.ietf.org/html/rfc7519#section-4 public const ssortingng Actort = "actort"; // // Summary: // http://tools.ietf.org/html/rfc7519#section-4 public const ssortingng Typ = "typ"; // // Summary: // http://tools.ietf.org/html/rfc7519#section-4 public const ssortingng Sub = "sub"; // // Summary: // http://openid.net/specs/openid-connect-frontchannel-1_0.html#OPLogout public const ssortingng Sid = "sid"; // // Summary: // http://tools.ietf.org/html/rfc7519#section-4 public const ssortingng Prn = "prn"; // // Summary: // http://tools.ietf.org/html/rfc7519#section-4 public const ssortingng Nbf = "nbf"; // // Summary: // http://tools.ietf.org/html/rfc7519#section-4 public const ssortingng Nonce = "nonce"; // // Summary: // http://tools.ietf.org/html/rfc7519#section-4 public const ssortingng NameId = "nameid"; } } 

Nous ne pouvons pas définir l’énumération comme type de chaîne. Les types approuvés pour une énumération sont octet, sbyte, short, ushort, int, uint, long ou ulong.

Si vous avez besoin de plus de détails sur l’énumération, veuillez suivre le lien ci-dessous, ce lien vous aidera à comprendre l’énumération. Énumération

@ narendras1414

Classe d’énumération

  public sealed class GenericDateTimeFormatType { public static readonly GenericDateTimeFormatType Format1 = new GenericDateTimeFormatType("dd-MM-YYYY"); public static readonly GenericDateTimeFormatType Format2 = new GenericDateTimeFormatType("dd-MMM-YYYY"); private GenericDateTimeFormatType(ssortingng Format) { _Value = Format; } public ssortingng _Value { get; private set; } } 

Enumaration Consuption

 public static void Main() { Country A = new Country(); A.DefaultDateFormat = GenericDateTimeFormatType.Format1; Console.ReadLine(); }