如何在 C# 中将双精度转换为枚举结构内的字符串

本文关键字:枚举 结构 字符串 转换 双精度 | 更新日期: 2023-09-27 17:57:20

这些都不起作用:

 public enum OsVersioniOS : int
 { 
    '8.0' = 1 << 0,
    "8.1" = 1 << 1,
    string(8.2) = 1 << 2,
 }

我希望 8.0 [这是 iOS 操作系统的类型] 被视为枚举中的字符串。

如何在 C# 中将双精度转换为枚举结构内的字符串

是不可能的,枚举必须具有有效的 根据 C# 语言规范的标识符小节(C# 5.0 版本中的 2.4.2 小节),你能做的最好的事情就是使用一个DisplayAttribute,根据你用来向用户显示信息的框架,它可能会也可能不会自动拾取。

public enum OsVersioniOS : int
{ 
    [Display(ShortName="8.0")]
    v8_0 = 1 << 0,
    [Display(ShortName="8.1")]
    v8_1 = 1 << 1,
    [Display(ShortName="8.2")]
    v8_2 = 1 << 2,
}

这是一个帮助程序扩展方法,如果您不使用将自动拉取 ShortName 的框架,则可以将枚举转换为其字符串描述。

/// <summary>
/// Gets the text from the <see cref="DisplayAttribute"/> ShortName associated with the enum member.
/// </summary>
/// <param name="value">The enum value to check.</param>
/// <returns>The value of the Display - ShortName attribute or null if not available.</returns>
public static string GetShortName(this Enum enumValue)
{
    return enumValue.GetType()
                    .GetMember(enumValue.ToString())
                    .First()
                    .GetCustomAttribute<DisplayAttribute>()
                    .GetShortName();
}

这是不可能的,正确的方法是:

public enum OsVersioniOS
 { 
    [Description("8.1")]
    One,
    [Description("8.2")]
    Two
 }

正如 Scott 和 Renato 所说,实现此目的的正确方法是使用属性来装饰要显示的信息的枚举。

public enum OsVersioniOS : int
{ 
    [Display(Name="8.0")]
    Version_8_0 = 1 << 0,
    [Display(Name="8.1")]
    Version_8_1 = 1 << 1,
    [Display(Name="8.2")]
    Version_8_2 = 1 << 2,
    //etc.
}

定义这些属性后,可以通过反射从枚举中检索设置。例如:

{
     OsVersioniOS enumMember = GetEnumThatYouNeedNameOf();
     var type = typeof(OsVersioniOS);
     var memberInfo = type.GetMember(enumMember.ToString());
     var attribute = (DisplayAttribute)memberInfo[0].GetCustomAttributes(typeof(DisplayAttribute),false)
     var value = attribute.Name;
     return value;
}

如果您要经常使用它,我建议将其包装在扩展方法或静态帮助程序方法中。如果需要更多值,可以创建自己的属性,而不是使用"显示"或"说明"。