2012-04-05 3 views
4

Надеюсь, я могу объяснить свою проблему так, чтобы это было ясно для всех. Нам нужны ваши предложения по этому поводу.Enum и словарь <Enum, Action>

У нас есть тип Enum, который имеет более 15 констант. Мы получаем отчет из веб-службы и переводим его один столбец в этот тип Enum. И на основе того, что мы получаем от этого веб-сервиса, мы запускаем определенные функции, используя Словарь

Почему я прошу идеи? Предположим, что 3 из этих участников Enum отвечают определенным функциям в нашем словаре, а остальные используют ту же функцию. Итак, есть ли способ добавить их в наш Словарь лучше, чем добавлять их по одному? Я также хочу сохранить эту структуру, потому что, когда пришло время, у нас могут быть конкретные функции в будущем для тех, которые я назвал «остальными».

Чтобы быть более ясным, вот пример того, что мы пытаемся сделать:

Enum:

public enum Reason{ 
    ReasonA, 
    ReasonB, 
    ReasonC, 
    ReasonD, 
    ReasonE, 
    ReasonF, 
    ReasonG, 
    ReasonH, 
    ReasonI, 
    ReasonJ, 
    ReasonK 
} 

Определение нашего словаря:

public Dictionary<Reason, Action<CustomClassObj, string>> ReasonHandlers = new Dictionary<Reason, Action<CustomClassObj, string>>{ 
    { Reason.ReasonA, HandleReasonA }, 
    { Reason.ReasonB, HandleReasonB }, 
    { Reason.ReasonC, HandleReasonC }, 
    { Reason.ReasonD, HandleReasonGeneral }, 
    { Reason.ReasonE, HandleReasonGeneral }, 
    { Reason.ReasonF, HandleReasonGeneral }, 
    { Reason.ReasonG, HandleReasonGeneral }, 
    { Reason.ReasonH, HandleReasonGeneral }, 
    { Reason.ReasonI, HandleReasonGeneral }, 
    { Reason.ReasonJ, HandleReasonGeneral }, 
    { Reason.ReasonK, HandleReasonGeneral } 
}; 

Поэтому в основном то, что я спрашиваю есть, есть ли способ добавить Причина, функция пара более разумно? Потому что, как вы можете видеть после ReasonC, все остальные причины используют одну и ту же функцию.

Благодарим вас за предложения.

+0

Это требует «переключения», если у вас нет динамических требований. – leppie

+1

Вы говорите, что можете получить набор значений, и если набор содержит как ReasonD, так и ReasonE, вы хотите запустить HandleReasonGeneral только один раз? – phoog

+0

для ReasonD и ReasonE Я хочу вызвать ту же функцию. Но я хочу добавить эту функцию в словарь эффективным образом. – selo

ответ

13

Вы можете попробовать что-то вроде этого, только поместите пользовательский обработчик причины в словарь, а затем вернитесь к генералу.

public Dictionary<Reason, Action<CustomClassObj, string>> ReasonHandlers = new Dictionary<Reason, Action<CustomClassObj, string>>{ 
    { Reason.ReasonA, HandleReasonA }, 
    { Reason.ReasonB, HandleReasonB }, 
    { Reason.ReasonC, HandleReasonC }}; 


public Action<CustomClassObj, string> ReasonHandlerLookup (Reason reason) { 
    Action<CustomClassObj, string> result = null; 
    ReasonHandlers.TryGetValue(reason, out result); 
    return result ?? HandleReasonGeneral; 
} 
+4

Индексатор будет генерировать исключение KeyNotFoundException, если ключ не существует. Вместо этого лучше использовать TryGetValue(). –

+0

@AdamGritt Ваше право, спасибо .. Я обновил код. – dmck

+0

Ваш прием. Вы получили мой голос. –

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