2013-07-11 3 views
0

Есть ли способ присвоить тип данных членам перечисления; например;Тип данных элемента перечисления

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

Почему я хочу это сделать? Так как он записан в базе данных, есть таблица CarProperties. И в таблице есть пара ключ-значение.

Ключ: Цвет, Ценность: красный; Ключ: Speed, Value: 250

Итак, когда я прочитал его из базы данных, я бы хотел, чтобы клавиша была нажата для CarPartEnum и значение для исправления типа данных.

+0

Похоже, вам нужен POCO (как Oded posts) и способ сопоставить ваши данные с вашим POCO. Это просто ужасный способ сделать это - извините :) –

+0

Как он хранится в db? Являются ли ключи и значения для всех строк? – 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

No.

Все 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

@ лазиберезовский - Конечно. Однако это не изменяет _type_ члена перечисления. – Oded

Смежные вопросы