For when you must have a delegate (nothing in your code tells me that you do):
private Func<Order, OrderResult> GetDispatcherForOrder(Order order)
{
switch (order.Type)
{
case "A":
return dispatcher => DispatchA(order.Id, order.Info, ...);
case "B":
return dispatcher => DispatchB(order.Id, order.Info, ...);
default:
throw new ArgumentOutOfRangeException("order.Type");
}
}
Order x = GetOrder();
Func<Order, OrderResult> myFunction = GetDispatcherForOrder;
OrderResult myResult = myFunction(x);
For when you just need to get OrderResult:
private OrderResult GetDispatcherForOrder(Order order)
{
switch (order.Type)
{
case "A":
return DispatchA(order.Id, order.Info, ...);
case "B":
return DispatchB(order.Id, order.Info, ...);
default:
throw new ArgumentOutOfRangeException("order.Type");
}
}
Order x = GetOrder();
OrderResult myResult = GetDispatcherForOrder(x);