Могу предложить следующее:
1] «Парные» методы могут быть сгруппированы вместе
Каждый человек должен иметь возможность обрабатывать значение NULL. Таким образом, у вас будут следующие две группы:
Queue.Peek(TimeOut)
Queue.Receive(TimeOut)
Queue.ReceiveById(Id, TimeOut)
Queue.PeekById(Id, TimeOut)
...
2] Объявить двух делегатов для групп методов
delegate Message MethodType1(Timeout)
delegate Message MethodType2(Id, TimeOut)
3] Иметь метод GetDelegate (), который будет возвращать соответствующий метод для выполнения
object GetDelegate(ReadDecisions param)
{
switch(param)
{
case ReadNext:
MethodType1 receiveDlgt = new MethodType1(queue.Receive);
case PeekMessageId:
MethodType2 peekDlgt = new MethodType2(queue.Peek);
...
}
}
4] Выполните соответствующий вызов в зависимости от типа делегата
InvokingMethod()
{
object methodToExecute = GetDelegate(ReadDecision)
if (methodToExecute.GetType() == typeof(MethodType1))
{
methodToExecute(TimeOut)
}
else
{
methodToExecute(Id, TimeOut)
}
}
Надеюсь, это поможет.
Некоторые детали могут нуждаться в доработке в соответствии с хорошими практиками программирования.