如何用空格表示枚举值?

时间:2013-06-23 09:52:05

标签: c# mysql performance enums

我的数据库中有enums,如下所示:

  

“Random Type”,“Random Type1”,“NewRandom”

通常,我会在枚举中表示值:

enum myTypes
{
   Random Type = 0,...
}

但这是不可能的,所以我尝试使用类

static class myTypes
{
    public const string RandomType = "Random Type";
    public const string NewRandom = "NewRandom";
}

这样,我可以像Enum那样使用类,但我想知道这是否是最好的实现?或者是否在创建Enums以允许空间?

感谢。

修改 拜托,我也想知道我目前的实施是否有任何问题。我觉得我目前的实施方式比大多数建议的解决方案更好。

由于

6 个答案:

答案 0 :(得分:3)

不,你不能这样做。枚举只是类型安全的int

有一个可用的解决方案,我非常喜欢它。使用DescriptionAttribute

你会这样使用它:

static enum myTypes
{
    [Description("Random Type")]
    RandomType,
    [Descripton("New Random")]
    NewRandom
}

然后你还需要这个扩展方法:

public static string GetDescription<T>(this T en) where T : struct, IConvertible
{
    Type type = typeof(T);
    if (!type.IsEnum)
    {
        throw new ArgumentException("The type is not an enum");
    }
    MemberInfo[] memInfo = type.GetMember(en.ToString());
    if (memInfo != null && memInfo.Length > 0)
    {
        object[] attrs = memInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false);
        if (attrs != null && attrs.Length > 0)
        {
            return ((DescriptionAttribute)attrs[0]).Description;
        }
    }
    return en.ToString();
}

然后,你可以这样做:

myTypes.RandomType.GetDescription();

答案 1 :(得分:2)

枚举与数字(特别是整数)非常相似,而不是字符串左右。坚持使用编号的枚举可以轻松进行投射,标记合成(例如AND,OR等)。

我不会使用字符串常量来代替枚举,除非这会给你带来比惩罚更多的好处。

如果您的目标是向用户描述枚举选项,我建议您考虑使用Description属性来丰富每个项目。它是元数据,而不是真实的数据,但使用反射也很容易阅读。

干杯

答案 2 :(得分:2)

我所做的是定义可以附加到枚举值的自定义属性[DisplayName(string)]。您可以在希望用空格/特殊字符命名的值上定义带有显示名称的枚举:

public enum Test
{
    None = 0,

    [DisplayName("My Value")]
    MyValue = 1,

    [DisplayName("Spęćiał")]
    Special = 2
}

除了获取枚举值名称之外,您的实现还应该检查是否设置了DisplayName属性,如果是,则应该使用显示名称。

答案 3 :(得分:1)

我会使用显示名称属性:

[AttributeUsage(AttributeTargets.Field)]
public class EnumDisplayNameAttribute : DisplayNameAttribute
{
    public EnumDisplayNameAttribute()
        : base(string.Empty)
    {
    }

    public EnumDisplayNameAttribute(string displayName)
        : base(displayName)
    {
    }
}


public static class EnumExtensions
{
    public static string ToDisplayName(this Enum enumValue)
    {
        var builder = new StringBuilder();

        var fields = GetEnumFields(enumValue);

        if (fields[0] != null)
            for (int i = 0; i < fields.Length; i++)
            {
                var value = fields[i]
                    .GetCustomAttributes(typeof(EnumDisplayNameAttribute), false)
                    .OfType<EnumDisplayNameAttribute>()
                    .FirstOrDefault();

                builder.Append(value != null
                                   ? value.DisplayName
                                   : enumValue.ToString());

                if (i != fields.Length - 1)
                    builder.Append(", ");
            }

        return builder.ToString();
    }

    private static FieldInfo[] GetEnumFields(Enum enumValue)
    {
        var type = enumValue.GetType();

        return enumValue
            .ToString()
            .Split(new[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries)
            .Select(type.GetField)
            .ToArray();
    }
}

用于类型:

public enum MyType
{
    [DisplayName("Random Type")]
    RandomType,
    [DisplayName("New Random")]
    NewRandom
}

将是:

var enumVariable = MyType.RandomType;
var stringRepresentation = enumVariable.ToDisplayName();

请注意,使用该方法,如果省略某些枚举成员的属性,则会获得ToString值。

答案 4 :(得分:0)

您可能在数据库中使用字符串作为类型指示符。改为使用整数。如果您愿意,可以在数据库中使用“类型表”,您可以在其中存储类型名称,而不是通过使用它们的表重复它们。

如果这样做,那么您可以按照上面的建议将数据库中的整数转换为枚举。

答案 5 :(得分:0)

您可以使用Typesafe Enum模式来实现目标。

想法是将你的枚举包装在一个类中。我想这就是你想要的 -

public class MyTypes
{
    #region Enum Values

    public static MyTypes RandomType = new MyTypes(0, "Random Type");
    public static MyTypes NewRandom = new MyTypes(1, "New Random");

    #endregion

    #region Private members

    private int id;
    private string value;
    private MyTypes(int id, string value)
    {
        this.id = id;
        this.value = value;
    }

    #endregion

    #region Overriden members

    public override string ToString()
    {
        return value;
    }

    #endregion

    public static List<MyTypes> GetValues()
    {
        return new List<MyTypes>() { MyTypes.RandomType, MyTypes.NewRandom };
    }
}