2012-04-05 67 views
4

我希望我能以一種對每個人都清楚的方式解釋我的問題。 我們需要你的建議。Enum和Dictionary <Enum,Action>

我們有一個枚舉類型,它定義了15個以上的常量。 我們收到來自Web服務的報告並將其一列轉換爲此Enum類型。 基於我們從該網絡服務收到的信息,我們使用 運行特定功能字典

爲什麼我要求點子? 假設這些枚舉語言中的3個符合我們字典中的特定函數,但其​​餘的函數使用相同的函數。那麼,有沒有辦法以更好的方式將它們添加到我們的詞典中,而不是逐個添加它們?我也想保持這種結構,因爲當時間到了,我們將來可能會有特定的功能,我稱之爲「其餘」。

更清楚這裏就是我們正在努力做一個例子:

枚舉:

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

這需要一個'switch',除非你有一些動態的要求。 – leppie 2012-04-05 17:22:39

+1

您是否在說可能會得到一組值,並且如果該集合包含ReasonD和ReasonE,那麼您只想運行HandleReasonGeneral一次? – phoog 2012-04-05 17:24:02

+0

ReasonD和ReasonE我想調用相同的功能。但我想以有效的方式將該函數添加到字典中。 – selo 2012-04-05 17:27:31

回答

13

你可以嘗試這樣的事情,只把自定義的Reason處理程序放到字典中,然後回退到General。

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()來代替。 – 2012-04-05 17:28:40

+0

@AdamGritt你的權利,謝謝..我已經更新了代碼。 – dmck 2012-04-05 17:32:10

+0

歡迎您。你有我的投票權。 – 2012-04-05 17:38:10