枚举成员数据类型

时间:2013-07-11 14:57:51

标签: c# enums

有没有办法为枚举成员分配数据类型; 例如;

  public enum CarPartEnum
{
    [string]
    Color,
    [int]
    Speed
}

为什么我要这样做? 因为它在数据库中的记录方式,所以有一个CarProperties表。 表中有一个键值对。

关键:颜色,值:红色; 关键:速度,价值:250

所以当我从数据库中读取它时,我想将密钥转换为CarPartEnum并将值转换为正确的数据类型。

3 个答案:

答案 0 :(得分:6)

没有

所有enum类型都基于整数类型。您无法将类型分配给特定的枚举成员。

请参阅MSDN上的Enum Class

  

枚举是一组命名常量,其基础类型是任何整数类型。如果未显式声明基础类型,则使用Int32。 Enum是.NET Framework中所有枚举的基类。


您可以使用属性为成员提供额外的元数据,但您需要使用反射才能使用这些属性。

但是,根据您的描述,您可能需要一个自定义类来反映您在数据库中的内容。

public class CarPart
{
    public string Color { get; set; }
    public int Speed { get; set; }
}

答案 1 :(得分:3)

也许这样的自定义属性:

public class MyTypeAttribute : Attribute
    {
        private readonly Type Type;
        public MyTypeAttribute (Type type)
        {
            Type = type;
        }
        public override string ToString()
        {
            return Type.ToString();
        }
    }

并像这样使用它:

public enum CarPartEnum
{
    [MyType(typeof(string))]
    Color,
    [MyType(typeof(int))]
    Speed
}

但我同意Oded的回答,你应该使用镜像数据库的自定义类。

答案 2 :(得分:1)

您可以创建自定义属性,可分配给具有type属性的成员。 包括如何访问它。

[AttributeUsage(AttributeTargets.Field, AllowMultiple = false)]
public class FieldTypeAttribute : Attribute
{
    public FieldTypeAttribute(Type type)
    {
        Type = type;
    }
    public Type Type { get; set; }

}

public static class FieldTypeInfo<TEnum> where TEnum : struct
{
    public static readonly IDictionary<TEnum, FieldTypeAttribute> Types;

    static FieldTypeInfo()
    {
        var enumTypes = from e in Enum.GetValues(typeof (TEnum)).Cast<TEnum>()
            join m in typeof (TEnum).GetFields(BindingFlags.Public | BindingFlags.Static)
                on e.ToString() equals m.Name
            let i = m.GetCustomAttributes().OfType<FieldTypeAttribute>().SingleOrDefault()
            select new {e, i};

        Types = enumTypes.ToDictionary(es => es.e, es => es.i);
    }
}