如何定义一个string值的枚举?

我想要定义一个Enum并添加有效的通用分隔符,在CSV或类似的文件中使用。 然后我将它绑定到一个ComboBox作为数据源,所以每当我添加或从Enum定义中删除,我都不需要改变combobox中的任何东西。

问题是我怎样才能用string表示定义枚举,如下所示:

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

你不能 – 枚举值必须是整数值。 您可以使用属性来将string值与每个枚举值相关联,或者在这种情况下,如果每个分隔符都是单个字符,则可以只使用char值:

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

(编辑:只是为了澄清,你不能使char的枚举的基础types,但你可以使用char常量来分配对应于每个枚举值的整数值。上面的枚举的基本types是int

那么如果你需要一个扩展方法:

 public string ToSeparatorString(this Separator separator) { // TODO: validation return ((char) separator).ToString(); } 

据我所知,你不会被允许分配string值枚举。 你可以做的是创build一个类中有string常量的类。

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

你可以实现它,但需要一点工作。

  1. 定义一个属性类,它将包含枚举的string值。
  2. 定义一个将从属性返回值的扩展方法。 例如.GetStringValue(这个枚举值)将返回属性值。
  3. 然后你可以像这样定义枚举
公共枚举testing:int {
     [的StringValue( “A”)]
     Foo = 1,
     [的StringValue( “B”)]
    东西= 2        
 } 
  1. 从Attrinbute Test.Foo.GetStringValue()返回值;

参考: 使用C#中的string值的枚举

你不能用枚举来做到这一点,但你可以这样做:

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

你不能,因为枚举只能基于一个原始的数字types。 你可以尝试使用Dictionary而不是:

 Dictionary<String, char> separators = new Dictionary<string, char> { {"Comma", ','}, {"Tab", '\t'}, {"Space", ' '}, }; 

或者,您可以使用Dictionary<Separator, char>Dictionary<Separator, string> ,其中Separator是一个普通的枚举:

 enum Separator { Comma, Tab, Space } 

这比直接处理string要舒服一点。

对于string值(或任何其他types)的简单枚举:

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

用法: string MyValue = MyEnumClass.MyValue1;

那么首先你尝试分配string不是字符,即使它们只是一个字符。 使用“,”而不是“,”。 接下来的事情是,枚举只能使用整数types没有char你可以使用unicode值,但我强烈build议你不要这样做。 如果你确定这些值保持不变,在不同的文化和语言,我会使用一个静态类与常量string。

虽然实际上不可能使用charstring作为枚举的基础,但我认为这不是你真正想做的事情。

就像你提到的,你想有一个可能性的枚举,并在combobox中显示这个string表示。 如果用户select这些string表示中的一个,则希望获得相应的枚举。 这是可能的:

首先,我们必须将一些string链接到一个枚举值。 这可以通过使用像这里或这里描述的DescriptionAttribute来完成。

现在您需要创build一个枚举值列表和相应的描述。 这可以通过使用以下方法来完成:

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

现在,您将获得所有枚举的键值对及其描述的列表。 所以让我们简单地把它当作一个combobox的数据源。

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

用户可以看到枚举的所有string表示,并在您的代码中获得所需的枚举值。

我们不能将枚举定义为stringtypes。 enum的批准types是byte,sbyte,short,ushort,int,uint,long或ulong。

如果你需要更多的枚举详情,请点击下面的链接,该链接将帮助你理解枚举。 列举

@ narendras1414

Enumaration类

  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(string Format) { _Value = Format; } public string _Value { get; private set; } } 

Enumaration Consuption

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