如何在C#枚举中使用特殊字符?

时间:2010-03-03 18:41:42

标签: .net enums special-characters

例如:

public enum Unit{
  KW,
  kV,
  V,
  Hz,
  %V
}

在这种情况下,%是一个特殊字符。那么,我怎样才能将这个字符放入枚举中?

8 个答案:

答案 0 :(得分:30)

即使你可以这样做(它看起来你不能),它可能不是一个好主意,因为你将混合枚举应该如何与程序代码一起显示来操纵它。一个更好的选择是定义一个属性(或使用现有的DisplayNameAttribute)并用名称作为附加元数据注释你的枚举:

public enum Unit{ 
  [DisplayName("Hz")] Hertz, 
  [DisplayName("%V")] Volt 
} 

答案 1 :(得分:8)

不应将枚举成员用于用户界面显示目的。应将它们映射到字符串以便显示。您可以创建一个字符串数组(或字典),将每个枚举成员映射到字符串以进行用户交互。

也就是说,要直接回答您的问题,您可以使用\uxxxxV xxxx是表示%的Unicode代码点的十六进制数字。这远非推荐。正如Henk所指出的,这对%不起作用,因为它不在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值更好的名字

查看我的博客了解更多详情

http://www.bryanavery.co.uk/post/2010/01/08/How-do-you-retrieving-the-XmlEnumAttribute-values-for-an-Enum.aspx

答案 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(" ", "_"));

考虑编写更好的代码

的一些规则
  • 始终将类型写入枚举,在您的情况下,单位应为 UnitType
  • 使用枚举对象的标题大小写

提醒

  • 您可以在位操作中使用Enum添加[Flags]关键字
  • 如果您不想拥有,则可以指定Enum的整数值:0,1,2,3 ...

我希望我能帮助别人。