使用委托基于某个值调用两个不同的函数

时间:2017-02-01 05:47:24

标签: c# delegates

我有两个具有不同功能的功能,我想根据某些值调用它们。没有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
}

如果intentMapTicketbookingInformation然后调用BookTicket方法或intentMapOrderInformation,那么我想切换这些功能,然后调用BookOrder方法

我想以通用的方式使用deleagtes,所以将来如果我有更多的用例(新方法),所以我可以使用相同的functionlaity而不需要修改太多。

2 个答案:

答案 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()
      }

}

这样你就需要扩展这个方法来处理新的令牌。它是更具可读性的方法,与字典版本相比,您不会丢失任何东西。所以我会这样做。如果没有更复杂的代码,你的例子更简化;]