如何定义一个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 " ";} } }
你可以实现它,但需要一点工作。
- 定义一个属性类,它将包含枚举的string值。
- 定义一个将从属性返回值的扩展方法。 例如.GetStringValue(这个枚举值)将返回属性值。
- 然后你可以像这样定义枚举
公共枚举testing:int { [的StringValue( “A”)] Foo = 1, [的StringValue( “B”)] 东西= 2 }
- 从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。
虽然实际上不可能使用char
或string
作为枚举的基础,但我认为这不是你真正想做的事情。
就像你提到的,你想有一个可能性的枚举,并在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<Enum, string> 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(); }