2017-02-01 14 views
0

我有兩個函數具有不同的功能,我想根據某些值調用它們。如果沒有,或者切換大小寫塊。像我有使用代理調用基於某個值的兩個不同函數

Dictionary<string, string> intentMap = new Dictionary<string, string>(); 
intentMap.Add("rootIntent", "TicketbookingInformation"); 
intentMap.Add("rootIntent", "OrderInformation"); 

and i have two function 

public bool BookTicket() 
{ 
    // to do 
} 

public bool BookOrder() 
{ 
    // to do 
} 

我想切換這些功能如果intentMapTicketbookingInformation然後調用BookTicket方法或者intentMapOrderInformation然後調用BookOrder方法。

我想以通用的方式使用deleagtes,所以在將來如果我有一些更多的用例(新方法),所以我可以使用相同的functionlaity而無需修改太多。

+0

由於知道這可能不是生產代碼,我仍然覺得需要指出的是,使用相同的密鑰添加兩個值像你正在做的'Dictionary'會拋出'ArgumentException'。 – Abion47

回答

1

使用另一個字典,這個時候<string, Func<bool>類型:

var delegateMap = new Dictionary<string, Func<bool>>() 
{ 
    { "TicketBookingInformation", BookTicket }, 
    { "OrderInformation", BookOrder } 
}; 

foreach (var intent in intentMap) 
{ 
    bool result = delegateMap[intent.Value](); 
} 
+0

對於'foreach'我幾乎沒有問題糾正過,請看一看 –

+0

@不幸的是他們不是問題。我正在循環OP引入問題的'intentMap',並在與'KeyValuePair'的值對應的委託字典中調用'Func'。 – Abion47

+0

實際上,Op的輸入是錯誤的,它包含兩個不同項目的相同密鑰,這是不允許的。所以你的答案就足以讓我意識到他所期望的 –

0

我不會直接回答你的問題。 @ Abion47已經回答完美,我會回答相同的。

但我認爲有兩個詞典一個有令牌,另一個有委託更隱晦,然後有單一的調度結果的方法。

這裏有一點點代碼。

這是字典版本。

var intentMap = new Dicionary<string, string>(); 

var delegateMap = new Dictionary<string, Func<bool>>(); 
delegate.Map.Add("TicketbookingInformation", BookTicket); 
delegateMap.Add("OrderInformation", BookOrder); 

然後使用將是這樣的

var token = ...; 
if(intentMap.ContainsKey(token)) 
{ 
    var delegateToken = intenMap[token]; 
    if(delegateMap.ContainsKey(delegateToken)) 
    { 
     var delegatedMethod = delegateMap(delegateToken); 

     return delegatedMethod(); 
    } 
} 

因此添加新的令牌和代表將手段擴展字典,我看不出這是不同的,那麼延伸的switch語句。

第二個版本,我認爲將是足夠通用的,不需要太多的修改,在哪裏使用將是這樣的。

首先我會建議將"TicketbookingInformation""OrderInformation"作爲枚舉類型,這種方式有一個switch語句會受益於編譯器幫助,當你有一些遺漏的情況下處理。如果你知道前期所有可能的值這當然是適用]

bool PredicateDispatch(DelegateToken token) 
{ 
     switch(token) 
     { 
      DelegateToken.TicketbookingInformation: return BookTicket(); 
      DelegateToken.OrderInformation: return BookOrder() 
     } 

} 

這種方式,你需要擴展這個單一的方法來處理新的令牌。這是更可讀的方法,與字典版本相比,您不會失去任何東西。所以我會這樣做。如果當然沒有更復雜的代碼,你的例子更簡化;]

相關問題