字符串枚举中的C#短划线(-)

本文关键字:枚举 字符串 | 更新日期: 2023-09-27 18:22:02

我正在为class中的字段创建枚举,我需要其中一个值为Start-up。但是,当我键入此内容时,会得到一个错误} expected。另一方面,创业是允许的,但我真的需要冲刺。。

对于空间,我还有其他领域也有同样的问题。。

有人知道我可以获得上面显示的值的方法吗?

代码示例:

using System;
namespace XMLConverter.Models
{
    public enum SiteStatus { Hold, Planned, Proposed, Qualifying, StartUp, Open, Enrollment Complete, Closed, Stopped, Not Selected, Withdrew }
    public class Site
    {
        public string StudyName { get; set; }
        public string SiteNumber { get; set; }
        public string SiteName { get; set; }
        public SiteStatus SiteStatus { get; set; }
    }
}

字符串枚举中的C#短划线(-)

你不能。C#中的标识符不允许使用短划线,因为它是一个运算符,所以枚举值也是如此。

这是没有办法的。我建议用另一个符号来代替它,比如下划线(_)。根据枚举的使用情况,您可能会幸运地使用序列化程序。例如,如果您使用JSON,则有可能以不同的方式序列化和反序列化值。

Enum成员与其他所有标识符一样,因此它们的名称需要满足一组规则。这些规则的一部分意味着标识符或枚举名称中不能有破折号。

如果你从实际角度考虑,那就没有多大意义了。想象一下如果Startup是两个变量会发生什么。由于C#忽略了表达式中的空白,Start-up表示Start - up,这是一个减法运算。

虽然枚举成员本身需要是一个有效的标识符,但您可以控制如何将其呈现给其他方。例如,可以使用DisplayAttribute来影响它在UI上的呈现方式,也可以使用DataMemberAttribute来影响其序列化方式。

c#中的标识符不能包含短划线字符,因此不能执行此操作。

如果需要获得枚举值的描述,可以使用[Description]属性,例如:

enum TestEnum
{
    [Description("Start-up")]
    StartUp
}
TestEnum val = TestEnum.StartUp;
string desc = GetEnumDescription((TestEnum)val);

方法GetEnumDescription如下所示:(来源:如何从值中获取C#Enum描述?)

public static string GetEnumDescription(Enum value)
{
    FieldInfo fi = value.GetType().GetField(value.ToString());
    DescriptionAttribute[] attributes =
        (DescriptionAttribute[])fi.GetCustomAttributes(
        typeof(DescriptionAttribute),
        false);
    if (attributes != null &&
        attributes.Length > 0)
        return attributes[0].Description;
    else
        return value.ToString();
}

没有理由在枚举值中放入"-"。

1.如果你想以这种方式向你的应用程序用户显示它,你可以创建一个属性,并在显示枚举值时检查该属性的值。

2.正如@patric所指出的,用一个字符替换它,并在显示值时检查字符的存在性,并用"-"替换它

乍一看,这很奇怪,但现在在微服务中,一些其他语言(如GoLang)在枚举名称中使用"dash",这对它们来说是可以的,但在c#中,我们必须为它们添加一个属性来处理这个问题。

using System;
using System.Linq;
using System.Reflection;
using System.Runtime.Serialization;
public  class Program
{
    public static void Main()
    {
        var toolViewMode = ToolViewModeType.Extended;
        Console.WriteLine(toolViewMode.GetEnumMemberValue());
    }
}
public static class  Extensions {
    
        public static string GetEnumMemberValue<T>(this T value)
            where T : struct, IConvertible
        {
            return typeof(T)
                .GetTypeInfo()
                .DeclaredMembers
                .SingleOrDefault(x => x.Name == value.ToString())
                ?.GetCustomAttribute<EnumMemberAttribute>(false)
                ?.Value;
        }
}
public enum ToolViewModeType
{
    [EnumMember(Value = "basic-view")]
    Basic,
    [EnumMember(Value = "extended-view")]
    Extended
}