0

列挙型メンバーにデータ型を割り当てる方法はありますか? 例えば;

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

なぜ私はこれをしたいのですか?データベースに記録される方法のため、CarProperties テーブルがあります。テーブルにはキーと値のペアがあります。

キー: 色、値: 赤。キー: 速度、値: 250

したがって、データベースから読み取るときに、キーを CarPartEnum にキャストし、値を正しいデータ型にキャストする必要があります。

4

3 に答える 3

6

いいえ。

すべてenumの型は整数型に基づいています。特定の列挙型メンバーに型を割り当てることはできません。

Enum ClassMSDNを参照してください:

列挙型は、基になる型が任意の整数型である名前付き定数のセットです。基になる型が明示的に宣言されていない場合は、Int32 が使用されます。Enum は、.NET Framework のすべての列挙の基本クラスです。


属性を使用して追加のメタデータをメンバーに与えることができますが、そのような属性を利用するにはリフレクションを使用する必要があります。

ただし、あなたの説明から、データベースにあるものを反映するカスタム クラスが必要になる可能性があります。

public class CarPart
{
    public string Color { get; set; }
    public int Speed { get; set; }
}
于 2013-07-11T15:01:26.510 に答える
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 の回答には同意します。

于 2013-07-11T15:02:13.320 に答える
1

タイプ プロパティを持つメンバーに割り当て可能なカスタム属性を作成できます。アクセス方法をまとめました。

[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);
    }
}
于 2013-07-11T15:00:53.627 に答える