我需要一个枚举或类似的东西来做这样的事情:
这可能吗?我的例子,我返回一个数据集,其值表示为A,B,C,D,E ..我需要一个解决方案将其作为字符串表示返回?public enum MyStringEnum { [StringValue(“Foo A”)] Foo =“A”, [StringValue(“Foo B”)] Foo =“B”}
我想显而易见的是创建一个扩展方法或只有一个switch语句并返回一个字符串的东西..还有其他更干净的解决方案吗?
的问候, 戴夫
答案 0 :(得分:7)
这是我们用于MVC应用程序检索枚举的显示名称的内容。它使用自定义属性和扩展方法来检索枚举显示名称。
[AttributeUsage(AttributeTargets.Field, AllowMultiple = false)]
public class EnumDisplayNameAttribute : Attribute
{
public EnumDisplayNameAttribute(string displayName)
{
DisplayName = displayName;
}
public string DisplayName { get; set; }
}
public static string GetDisplayName(this Enum enumType)
{
var displayNameAttribute = enumType.GetType()
.GetField(enumType.ToString())
.GetCustomAttributes(typeof(EnumDisplayNameAttribute), false)
.FirstOrDefault() as EnumDisplayNameAttribute;
return displayNameAttribute != null ? displayNameAttribute.DisplayName : Enum.GetName(enumType.GetType(), enumType);
}
枚举上的用法:
public enum Foo
{
[EnumDisplayName("Foo Bar")]
Bar = 0
}
取回显示名称:
var f = Foo.Bar;
var name = f.GetDisplayName();
答案 1 :(得分:1)
如果你想做这样的事情:
MyStringEnum value = MyStringEnum.A;
string description = value.GetDescription();
// description == "Foo A"
像这样设置你的枚举:
public enum MyStringEnum
{
[Description("Foo A")]
A,
[Description("Foo B")]
B
}
并使用读取属性的实用程序/扩展方法:
public static string GetDescription(this MyStringEnum enumerationValue)
{
Type type = enumerationValue.GetType();
string name = enumerationValue.ToString();
//Tries to find a DescriptionAttribute for a potential friendly name for the enum
MemberInfo[] member = type.GetMember(name);
if (member != null && member.Length > 0)
{
object[] attributes = member[0].GetCustomAttributes(typeof(DescriptionAttribute), false);
if (attributes != null && attributes.Length > 0)
{
//Pull out the description value
return ((DescriptionAttribute)attributes[0]).Description;
}
}
return name;
}
答案 2 :(得分:1)
是不是可以选择不使用枚举而是使用结构?
struct FooEnum
{
private int value;
private string name;
private FooEnum(int value, string name)
{
this.name = name;
this.value = value;
}
public static readonly FooEnum A = new FooEnum(0, "Foo A");
public static readonly FooEnum B = new FooEnum(1, "Foo B");
public static readonly FooEnum C = new FooEnum(2, "Foo C");
public static readonly FooEnum D = new FooEnum(3, "Foo D");
public override string ToString()
{
return this.name;
}
//TODO explicit conversion to int etc.
}
然后您可以像使用自己的ToString()重载的枚举一样使用FooEnum:
FooEnum foo = FooEnum.A;
string s = foo.ToString(); //"Foo A"
答案 3 :(得分:0)
我已经看到了这样做,我会把
MyStringEnum.Foo.ToString();
在这种情况下,它会给出“A”
答案 4 :(得分:0)
此问题最干净的解决方案是创建一个自定义属性,该属性将存储枚举常量所需的字符串值。我过去曾经使用过这种策略而且效果相当好。这是一篇博文,详细介绍了所涉及的工作:
Enum With String Values In C# - Stefan Sedich's Blog
当然,只有在需要某种有意义的文本时才需要这样做。如果枚举常量的名称适合您...那么您只需拨打ToString()
。
答案 5 :(得分:0)
我认为this可以提供帮助。我同意您应该为枚举创建UI包装器。