C# 枚举成员数据类型

C# 枚举成员数据类型,c#,enums,C#,Enums,是否有方法将数据类型分配给枚举成员; 比如, public enum CarPartEnum { [string] Color, [int] Speed } 我为什么要这么做? 由于它在数据库中的记录方式不同,因此存在一个CarProperty表。 表中有一个键值对 键:颜色,值:红色; 键:速度,值:250 所以,当我从数据库中读取它时,我希望将键强制转换为carparentum,并将值强制转换为正确的数据类型。您可以创建一个自定义属性,可分配给具有typ

是否有方法将数据类型分配给枚举成员; 比如,

  public enum CarPartEnum
{
    [string]
    Color,
    [int]
    Speed
}
我为什么要这么做? 由于它在数据库中的记录方式不同,因此存在一个CarProperty表。 表中有一个键值对

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


所以,当我从数据库中读取它时,我希望将键强制转换为carparentum,并将值强制转换为正确的数据类型。

您可以创建一个自定义属性,可分配给具有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);
    }
}
[AttributeUsage(AttributeTargets.Field,AllowMultiple=false)]
公共类FieldTypeAttribute:属性
{
公共字段类型属性(类型)
{
类型=类型;
}
公共类型类型{get;set;}
}
公共静态类FieldTypeInfo,其中TEnum:struct
{
公共静态只读IDictionary类型;
静态字段类型信息()
{
var enumTypes=来自Enum.GetValues(typeof(TEnum)).Cast()中的e
在typeof(TEnum).GetFields(BindingFlags.Public | BindingFlags.Static)中加入m
在e.ToString()上等于m.Name
设i=m.GetCustomAttributes().OfType().SingleOrDefault()
选择新的{e,i};
Types=enumTypes.ToDictionary(es=>es.e,es=>es.i);
}
}

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

请参阅MSDN上的:

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


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

但是,根据您所描述的,您可能需要一个自定义类来镜像数据库中的内容

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

可能是这样的自定义属性:

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
}
然后像这样使用它:

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的回答,即您应该使用镜像数据库的自定义类。

如何分配自定义属性
[Foo(typeof(string))]
?@lazyberezovsky-当然。不过,这并不会改变枚举成员的类型。您如何像OP所希望的那样,将字符串值分配给
CarPartEnum.Color
?我可以通过在MyTypeAttribute中添加一个对象类型的参数来实现,但这将导致使用int-type装箱。这就是我要寻找的,另外,我将这个答案与下面的解决方案结合起来,解决了我的问题。谢谢听起来您需要一个POCO(就像Oded帖子一样),以及一种将数据映射到POCO的方法。这是一种很糟糕的方法-抱歉:)它是如何存储在数据库中的?键和值都是字符串吗?
public class CarPart
{
    public string Color { get; set; }
    public int Speed { get; set; }
}