2013-07-11 84 views
0

有沒有辦法給枚舉成員分配數據類型;例如, ;枚舉成員數據類型

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

爲什麼我要這樣做? 因爲它被記錄在數據庫中的方式,有一個CarProperties表。 表中還有一個鍵值對。

Key:Color,Value:Red; 關鍵:速度,值:250

因此,當我從數據庫中讀取它時,我想將鍵轉換爲CarPartEnum並將值改爲正確的數據類型。

+0

聽起來像你需要一個POCO(和Oded文章一樣),以及將你的數據映射到你的POCO的方法。這只是一個可怕的做法 - 對不起:) –

+0

它是如何存儲在數據庫?鍵和值都是字符串嗎? – Winks

回答

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 
} 

但我與俄德的答案,你應該使用鏡像數據庫自定義類同意。

+0

你會如何分配一個字符串值到'CarPartEnum.Color',因爲OP似乎想要做的? – Oded

+0

我可以通過在MyTypeAttribute中添加一個更多的對象類型參數來實現,但它會導致使用int類型的裝箱。 –

+0

這就是我正在尋找的,再加上我與以下解決方案結合這個答案,並解決了我的問題。謝謝。 http://codereview.stackexchange.com/questions/5352/getting-the-value-of-a-custom-attribute-from-an-enum –

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); 
    } 
} 
6

所有enum類型基於整型。您不能將類型分配給特定的枚舉成員。

Enum Class MSDN上:

枚舉是一組命名的常量,其基礎類型爲任何整數類型。如果沒有顯式聲明基礎類型,則使用Int32。 Enum是.NET Framework中所有枚舉的基類。


您可以使用屬性來提供額外的元數據的成員,但您將需要以充分利用這些屬性的使用反射。

但是,根據您的描述,您可能需要一個自定義類來反映數據庫中的內容。

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

分配自定義屬性'[Foo(typeof(string))]''怎麼辦? –

+0

@lazyberezovsky - 當然。儘管如此,這並不會改變enum成員的_type_。 – Oded