2013-05-15 2 views
0

У меня есть форма, где я собираю данные от пользователей. Когда эти данные собираются, я передаю их различным партнерам, однако каждый партнер имеет свои собственные правила для каждой части данных, поэтому это нужно преобразовать. Я могу это сделать, но мои заботы о надежности. Вот код:Значение карты enum достоверно

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

public enum EmploymentStatusType 
{ 
    [Description("INVALID!")] 
    None = 0, 
    [Description("Permanent full-time")] 
    FullTime = 1, 
    [Description("Permanent part-time")] 
    PartTime = 2, 
    [Description("Self employed")] 
    SelfEmployed = 3 
} 

Когда форма представляется, выбранное значение преобразуется в соответствующий тип и хранится в другом классе - свойство выглядит следующим образом:

protected virtual EmploymentStatusType EmploymentStatus 
    { 
     get { return _application.EmploymentStatus; } 
    } 

Для окончательного биту головоломки, я преобразовать значение в партнеры требуемого значения строки:

Dictionary<EmploymentStatusType, string> _employmentStatusTypes; 
    Dictionary<EmploymentStatusType, string> EmploymentStatusTypes 
    { 
     get 
     { 
      if (_employmentStatusTypes.IsNull()) 
      { 
       _employmentStatusTypes = new Dictionary<EmploymentStatusType, string>() 
       { 
        { EmploymentStatusType.FullTime, "Full Time" }, 
        { EmploymentStatusType.PartTime, "Part Time" }, 
        { EmploymentStatusType.SelfEmployed, "Self Employed" } 
       }; 
      } 

      return _employmentStatusTypes; 
     } 
    } 

    string PartnerEmploymentStatus 
    { 
     get { return _employmentStatusTypes.GetValue(EmploymentStatus); } 
    } 

я называю PartnerEmploymentStatus, который затем возвращает окончательную выходную строку.

Любые идеи, как это можно сделать более надежными?

+3

Что такое «не надежный», по вашему мнению? –

+0

У меня есть проблема в том, что если/когда перечисления изменяются/растут - и это возможно, потому что новые партнеры могут иметь разные правила, которые должны быть размещены, тогда все остальные классы содержат преобразования, которые нужно изменить и отдохнуть. Если у меня будет 30 партнеров, это может стать большой задачей. – dotnetnoob

+1

Затем вам нужно реорганизовать его в одну область перевода. Coudl будет чем-то вроде реализации шаблона посетителя. Ваш выбор распределяет код (как вы сейчас делаете) или посетитель, который бы его централизовал. Вы должны создать определенную степень хрупкости, чтобы ваши тесты покрытия отображали проблемы, когда вы расширяетесь, чтобы заставить вас правильно поддерживать код. Вы находитесь в довольно распространенном quandry, который на самом деле является кодовым организационным. –

ответ

3

Затем вам необходимо реорганизовать его в одну область перевода. Может быть что-то вроде реализации шаблона посетителя. Ваш выбор распределяет код (как вы сейчас делаете) или посетитель, который бы его централизовал. Вы должны создать определенную степень хрупкости, чтобы ваши тесты покрытия отображали проблемы, когда вы расширяетесь, чтобы заставить вас правильно поддерживать код. Вы находитесь в довольно распространенном quandry, который на самом деле является кодовым организационным.

1

Я столкнулся с такой проблемой в одном из моих проектов, и решил ее с помощью вспомогательной функции и условных обозначений для имен ресурсов.

Функция это одна:

public static Dictionary<T, string> GetEnumNamesFromResources<T>(ResourceManager resourceManager, params T[] excludedItems) 
    { 
     Contract.Requires(resourceManager != null, "resourceManager is null."); 

     var dictionary = 
      resourceManager.GetResourceSet(culture: CultureInfo.CurrentUICulture, createIfNotExists: true, tryParents: true) 
      .Cast<DictionaryEntry>() 
      .Join(Enum.GetValues(typeof(T)).Cast<T>().Except(excludedItems), 
       de => de.Key.ToString(), 
       v => v.ToString(), 
       (de, v) => new 
       { 
        DictionaryEntry = de, 
        EnumValue = v 
       }) 
      .OrderBy(x => x.EnumValue) 
      .ToDictionary(x => x.EnumValue, x => x.DictionaryEntry.Value.ToString()); 
     return dictionary; 
    } 

Соглашение состоит в том, что в моем файле ресурсов я буду иметь свойства, которые являются такими же, как значения перечислений (в вашем случае None, PartTime и т.д.). Это необходимо для выполнения функции Join в вспомогательной функции, которую вы можете настроить в соответствии с вашими потребностями.

Таким образом, всякий раз, когда я хочу (локализованную) строку описания значения перечисления Я просто позвонить:

var dictionary = EnumUtils.GetEnumNamesFromResources<EmploymentStatusType>(ResourceFile.ResourceManager); 
var value = dictionary[EmploymentStatusType.Full]; 
Смежные вопросы