public enum Unit{
KW,
kV,
V,
Hz,
%V
}
在这种情况下,百分号(%)是一个特殊字符。那么,我该如何将这个字符放入枚举中?
public enum Unit{
KW,
kV,
V,
Hz,
%V
}
在这种情况下,百分号(%)是一个特殊字符。那么,我该如何将这个字符放入枚举中?
DisplayNameAttribute
),并将你的枚举注释为附加的元数据:public enum Unit{
[DisplayName("Hz")] Hertz,
[DisplayName("%V")] Volt
}
枚举成员不应用于用户界面显示目的。它们应该映射到一个字符串以便显示。你可以创建一个字符串数组(或字典)来将每个枚举成员映射到一个字符串用于用户交互。
话虽如此,直接回答你的问题,你可以使用正如Henk指出的那样,这对于\uxxxxV
,其中xxxx
是表示%
的Unicode代码点的十六进制数。但这远非推荐做法。%
是行不通的,因为它不属于Unicode类Lu、Ll、Lt、Lm、Lo、Nl、Mn、Mc、Nd、Pc、Cf(字母、数字、连接和格式化字符)。只有这些字符是可接受作为标识符的字符。
[Flags]
枚举类型时,枚举类型的值与枚举成员之间就不存在一对一的关系。 - Mehrdad Afshari[MyCustomAttribute(“一些字符串”)]
。 - tigrou仅仅是为了注册另一种简单的方法,你可以使用常量定义“你自己”的枚举器。在你的例子中
public class UnitEnum
{
public const string KW = "KW";
public const string Volt = "%V";
}
要访问它,只需输入:UnitEnum.Volt
这个答案与@Coppermill的答案有关,我觉得在处理枚举时使用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)
,我还有一个方法可以将枚举转换为KeyValuePair Enumerable以将枚举绑定到DropDown。
[Flags]
,否则我已经停止使用枚举。此时,我使用静态类和强类型代替。请参见 https://dev59.com/IXfZa4cB1Zd3GeqPXOJ7 - Chris Marisic我完全同意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
枚举成员不应用于用户界面显示目的。但是您可以使用以下的简单技巧,通过DisplayName("Your Property Display Name")来实现此目的。
//Enum
public enum ErrorCodes
{
[DisplayName("U-volt")] UVolt = 2,
[DisplayName("L-trip")] Ltrip = 5
}
//Here you can retrive Display name as bellow
public class MyClass{
public void readEnumDisplayName(){
String ErroCode = Enum.GetName(typeof(ErrorCodes), 5); // Find Error Name using Integer value
MemberInfo property = typeof(ErrorCodes).GetRuntimeField(ErroCode); //Find Field
var dd = property.GetCustomAttribute(typeof(DisplayNameAttribute)) as DisplayNameAttribute; //Find Display Attribute
if (dd != null) //Check if null
{
var name = dd.DisplayName; //Retrive Display name
}
}
}
public enum UnitType {
Kilowatt,
Kilovolt,
Volt,
Hertz,
Ohm,
Faraday
}
所以我可以将它们用作下拉菜单中的选项(例如,当我需要创建一个新项目时,我只需要将该项目附加到枚举中即可...)
ddl.Items.Clear();
foreach (string type in Enum.GetNames(typeof(UnitType)))
ddl.Items.Add(type);
我倾向于使用空格分隔符,但通常使用下划线来替代空格,例如:
public enum myType { Process_Time, Process_Order, Process_Invoices }
而 DropDownList 的项将会是
ddl.Items.Add(type.Replace("_", " "));
当我想从下拉列表中设置类型时,我使用解析。
UnitType unit = (UnitType)Enum.Parse(
typeof(UnitType),
ddl.SelectedValue.toString());
当然,如果您使用分隔符
ddl.SelectedValue.toString().Replace(" ", "_"));
一些规则需要考虑,以编写更好的代码
提醒一下
我希望我能帮助到某个人。