例如:
public enum Unit{
KW,
kV,
V,
Hz,
%V
}
在这种情况下,%是一个特殊字符。那么,我怎样才能将这个字符放入枚举中?
答案 0 :(得分:30)
即使你可以这样做(它看起来你不能),它可能不是一个好主意,因为你将混合枚举应该如何与程序代码一起显示来操纵它。一个更好的选择是定义一个属性(或使用现有的DisplayNameAttribute
)并用名称作为附加元数据注释你的枚举:
public enum Unit{
[DisplayName("Hz")] Hertz,
[DisplayName("%V")] Volt
}
答案 1 :(得分:8)
不应将枚举成员用于用户界面显示目的。应将它们映射到字符串以便显示。您可以创建一个字符串数组(或字典),将每个枚举成员映射到字符串以进行用户交互。
也就是说,要直接回答您的问题,您可以使用正如Henk所指出的,这对\uxxxxV
xxxx
是表示%
的Unicode代码点的十六进制数字。这远非推荐。%
不起作用,因为它不在Unicode类Lu,Ll,Lt,Lm,Lo,Nl,Mn,Mc,Nd, Pc,Cf(字母,数字,连接和格式化字符)。标识符只接受这些字符。
答案 2 :(得分:4)
只需注册另一种方式,以简单的方式,您可以定义"您自己的"具有常量的枚举器。在你的例子中
theButton[0].onclick = () => alert("Clicked")
要访问,只需:public class UnitEnum
{
public const string KW = "KW";
public const string Volt = "%V";
}
答案 3 :(得分:1)
这个答案与@Coppermill的答案有关我觉得在使用Enums时,使用DescriptionAttribute在语义上更正确
public enum ReportStatus
{
[Description("Reports that are running")] Running,
[Description("Reports that are pending to run")] Pending,
[Description("Reports that have errored while running")] Error,
[Description("Report completed successfully.")] Finished
}
然后我就这样读了
public static bool IsNullable(this Type type)
{
if (!type.IsGenericType)
return false;
var g = type.GetGenericTypeDefinition();
return (g.Equals(typeof (Nullable<>)));
}
public static Type ConcreteType(this Type type)
{
if (IsNullable(type))
type = UnderlyingTypeOf(type);
return type;
}
public static string ReadDescription<T>(T enumMember)
{
if (typeof (T).IsNullable() && enumMember == null) return null;
var type = (typeof (T).ConcreteType());
var fi = type.GetField(enumMember.ToString());
var attributes = fi.GetCustomAttributes(typeof (DescriptionAttribute), false);
if(attributes.Length == 0) return enumMember.ToString();
return attributes.Cast<DescriptionAttribute>().First().Description;
}
然后用法为ReadDescription(ReportStatus.Running)
我还有一个方法可以将Enum转换为可枚举的KeyValuePair,用于将Enum绑定到DropDown。
答案 4 :(得分:0)
我不确定你为什么要使用枚举中的特殊字符,但是如果你像我一样,你需要显示一个比使用枚举的XmlEnumAttribute值更好的名字
查看我的博客了解更多详情
答案 5 :(得分:0)
很抱歉,但我刚才意识到我没有回答这个问题。我不会删除我的答案,因为有人可能会发现这些代码段有用。
我完全赞同Tomas Petricek,所以我不会重复他的回答。
这是我解决问题的方法。我使用这段代码大约五年了。我决定创建一个自定义属性,以便将DisplayName属性用于标题等。
Public Module MainModule
Public Sub Main()
Console.WriteLine(EnumEx.GetNumberFormatString(Unit.Volt), 120.13)
End Sub
End Module
Public Enum Unit
<NumberFormatString("{0} Hz"), DisplayName("Hertz")> Hz
<NumberFormatString("{0} %V"), DisplayName("%Volt")> pV
End Enum
<AttributeUsage(AttributeTargets.All)> _
Public NotInheritable Class NumberFormatStringAttribute
Inherits Attribute
Public Shared ReadOnly [Default] As NumberFormatStringAttribute = New NumberFormatStringAttribute
Private _format As String
Public Sub New()
Me.New(Char.MinValue)
End Sub
Public Sub New(ByVal format As String)
_format = format
End Sub
Public Overrides Function Equals(ByVal obj As Object) As Boolean
If (obj Is Me) Then
Return True
End If
Dim oAttribute As NumberFormatStringAttribute = TryCast(obj, NumberFormatStringAttribute)
If (Not oAttribute Is Nothing) Then
Return (oAttribute.NumberFormatString = Me.NumberFormatString)
End If
Return False
End Function
Public Overrides Function GetHashCode() As Integer
Return Me.NumberFormatString.GetHashCode
End Function
Public Overrides Function IsDefaultAttribute() As Boolean
Return Me.Equals(NumberFormatStringAttribute.Default)
End Function
Public ReadOnly Property NumberFormatString() As String
Get
Return Me.NumberFormatStringValue
End Get
End Property
Private Property NumberFormatStringValue() As String
Get
Return _format
End Get
Set(ByVal value As String)
_format = value
End Set
End Property
End Class
Public NotInheritable Class EnumEx
Private Sub New()
End Sub
Public Shared Function GetNumberFormatString(ByVal value As Object) As String
Dim sResult As String = Nothing
Dim oFieldInfo As System.Reflection.FieldInfo = value.GetType.GetField(value.ToString)
If Not (oFieldInfo Is Nothing) Then
Dim oCustomAttributes() As Object = oFieldInfo.GetCustomAttributes(GetType(NumberFormatStringAttribute), True)
If (Not (oCustomAttributes Is Nothing)) AndAlso oCustomAttributes.Length > 0 Then
sResult = DirectCast(oCustomAttributes(0), NumberFormatStringAttribute).NumberFormatString
End If
End If
Return sResult
End Function
End Class
答案 6 :(得分:0)
枚举成员不应用于显示用户界面。但是您可以将简单技巧与 DisplayName(“您的财产显示名称”)一起使用,如下所述。
var childrens = media.Children().ToList()
答案 7 :(得分:-3)
有些人可以声明Enumerations仅用于Code,我必须不同意并且我使用Code和Display功能。
在您的特定情况下,我会使用完整的单词
public enum UnitType {
Kilowatt,
Kilovolt,
Volt,
Hertz,
Ohm,
Faraday
}
所以我可以在Dropdown中使用它们作为例子(当我需要创建一个新项目时,我需要做的就是将该项目附加到枚举...
ddl.Items.Clear();
foreach (string type in Enum.GetNames(typeof(UnitType)))
ddl.Items.Add(type);
我倾向于使用Space Separator,但我通常使用下划线来创建空格,比如
public enum myType { Process_Time, Process_Order, Process_Invoices }
和DropDownList项目将是
ddl.Items.Add(type.Replace("_", " "));
当我想从DropDown设置Type时,我使用Parse
UnitType unit = (UnitType)Enum.Parse(
typeof(UnitType),
ddl.SelectedValue.toString());
当然,如果您使用分隔符
ddl.SelectedValue.toString().Replace(" ", "_"));
考虑编写更好的代码
的一些规则提醒
我希望我能帮助别人。