2010-05-19 3 views
0

Как я могу реорганизовать этот код?Как я могу реорганизовать этот код? (шаблон состояния?)

public enum enum1 
{ 
    value1 = 0x01, 
    value2 = 0x02, 
    value3 = 0x03, 
    value4 = 0x04, 
    value5 = 0x05, 
    UNKNOWN = 0xFF 
} 

class class1 
{ 
    private const string STR_VALUE1 = "some text description of value1"; 
    private const string STR_VALUE2 = "some text description of value2"; 
    private const string STR_VALUE3 = "some text description of value3"; 
    private const string STR_VALUE4 = "some text description of value4"; 
    private const string STR_VALUE5 = "some text description of value5"; 
    private const string STR_VALUE6 = "some text description of unknown type"; 

    public static string GetStringByTypeCode(enum1 type) 
     { 
      switch(type) 
      { 
       case enum1.value1: 
        return STR_VALUE1; 
       case enum1.value2: 
        return STR_VALUE2; 
       case enum1.value3: 
        return STR_VALUE3; 
       case enum1.value4: 
        return STR_VALUE4; 
       case enum1.value5: 
        return STR_VALUE5; 
       default: 
        return STR_VALUE6; 
      } 
     } 
} 

PS: Есть много enum1 ... enumX и GetStringByTypeCode (enum1) ... GetStringByTypeCode (enumX) методы.

EDIT: Я переработан это так:

namespace ConsoleApplication4 
{ 
    public enum enum1 
    { 
     value1 = 0x01, 
     value2 = 0x02, 
     value3 = 0x03, 
     value4 = 0x04, 
     value5 = 0x05, 
     UNKNOWN = 0xFF 
    } 

    class class1 
    { 
     static Dictionary<enum1, string> _dict; 

     static class1() 
     { 
      _dict = new Dictionary<enum1, string>(); 

      _dict.Add(enum1.value1, "some text description of value1"); 
      _dict.Add(enum1.value2, "some text description of value2"); 
      _dict.Add(enum1.value3, "some text description of value3"); 
      _dict.Add(enum1.value4, "some text description of value4"); 
      _dict.Add(enum1.value5, "some text description of value5"); 
      _dict.Add(enum1.UNKNOWN, "some text description of unknown type"); 
     } 

     public static string GetStringByTypeCode(enum1 type) 
     { 
      string result = string.Empty; 

      try 
      { 
       _dict.TryGetValue(type, out result); 
      } 
      catch 
      { 
      } 

      return result; 
     } 
    } 


    class Program 
    { 
     static void Main(string[] args) 
     { 
      Console.WriteLine(class1.GetStringByTypeCode(enum1.value4)); 

      Console.ReadKey(); 
     } 
    } 
} 
+3

Чего вы хотите достичь? Меньше кода? Абилий легче добавить дополнительные пары значений/описания? Что-то другое? –

+0

@ Даниэль, я думаю, что код не идеален. Может быть, кто-то может предложить лучшее решение, поэтому я задаю вопрос ...... Абилий легче добавить дополнительные пары значений/описания -> да. –

ответ

2

Вы всегда можете сопоставить перечисление для строк в Dictionary<enum1, string>, а затем реализовать свой метод, ища правильную строку в словаре, основанный на перечислить ключ.

1

Вы можете реорганизовать Dictionary<int,string>.

Если вы хотите сохранить enum и его значение, используйте Dictionary<enum1,string>.

// private field 
private Dictionary<enum1,string> myDictionary = new Dictionary<enum1,string>(); 

// in constructor/other method 
myDictionary.Add(enum1.value1, "some text description of value1"); 
myDictionary.Add(enum1.value2, "some text description of value2"); 
myDictionary.Add(enum1.value3, "some text description of value3"); 
myDictionary.Add(enum1.value4, "some text description of value4"); 
myDictionary.Add(enum1.value5, "some text description of value5"); 
myDictionary.Add(enum1.UNKNOWN, "some text description of unknown type"); 

Затем реализовать простой поиск:

public string GetStringByTypeCode(enum1 type) 
{ 
    return myDictionary[type]; 
} 
0

Создать государство-класс с данными и операциями, которые необходимо. И пусть ваши государства наследуют от него.

abstract class State 
{ 
    public string Description { get; set; } 
    public void Behaviour(); 
} 

Вы можете инициализировать описание своих состояний в своих конструкторах.

public class MyClass 
    { 
     State s; 

     public MyClass(enum1 type) 
     { 
       switch(type) 
       { 
        case enum1.value1: 
         s = State1(); 
         break; 
        case enum1.value2: 
         s = State2(); 
         break; 
         ... 
       } 

     } 
    } 

Вы также можете использовать Карту, чтобы отобразить перечисление на объекты состояния. (Dictionary<enum1, State>))

Шаблон состояния имеет больше смысла, если у вас разные типы поведения в объектах состояния, а не в разных данных. Поэтому, если вы хотите сопоставить Enum to String, вы можете использовать, как уже упоминалось, словарь.

1

Другим углом может быть использование DescriptionAttribute и создание вспомогательного метода для получения описания для вас. Это немного дополнительной работы, но позволит сопоставить описание непосредственно к значению перечисления без необходимости поддерживать список, что-то вроде:

public enum Enum1 
{ 
    [Description("This is value 1")] 
    value1 = 0x001, 
    [Description("This is value 2")] 
    value2 = 0x002, 
    [Description("This is value 3")] 
    value3 = 0x003 
} 

.... 

public static class EnumExtensions 
{ 
    public static string GetDescription(this Enum value) 
    { 
     FieldInfo fi = value.GetType().GetField(value.ToString()); 
     DescriptionAttribute[] attributes = 
      (DescriptionAttribute[])fi.GetCustomAttributes(
      typeof(DescriptionAttribute), false); 
     return (attributes.Length > 0) ? attributes[0].Description : value.ToString(); 
    } 
} 

Затем, когда вам нужно описание вашего перечисления вы бы просто do:

Enum1 value = Emum1.Value1; 
string valueDesc = value.GetDescription(); 
Смежные вопросы