我有两个具有不同功能的功能,我想根据某些值调用它们。没有if else或switch case block。就像我有
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
}
如果intentMap
有TicketbookingInformation
然后调用BookTicket
方法或intentMap
有OrderInformation
,那么我想切换这些功能,然后调用BookOrder
方法
我想以通用的方式使用deleagtes,所以将来如果我有更多的用例(新方法),所以我可以使用相同的functionlaity而不需要修改太多。
答案 0 :(得分: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]();
}
答案 1 :(得分: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()
}
}
这样你就需要扩展这个方法来处理新的令牌。它是更具可读性的方法,与字典版本相比,您不会丢失任何东西。所以我会这样做。如果没有更复杂的代码,你的例子更简化;]