字符串枚举中的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#中的标识符不允许使用短划线,因为它是一个运算符,所以枚举值也是如此。
这是没有办法的。我建议用另一个符号来代替它,比如下划线(_
)。根据枚举的使用情况,您可能会幸运地使用序列化程序。例如,如果您使用JSON,则有可能以不同的方式序列化和反序列化值。
Enum成员与其他所有标识符一样,因此它们的名称需要满足一组规则。这些规则的一部分意味着标识符或枚举名称中不能有破折号。
如果你从实际角度考虑,那就没有多大意义了。想象一下如果Start
和up
是两个变量会发生什么。由于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
}