C#enums和booleans - 寻找更优雅的方式

Rob*_*ean 3 c# enums

我有一个具有枚举属性和布尔属性的类,基于它调用具有特定参数的特定方法.我对enum使用switch语句,在switch的每种情况下使用if作为布尔值.这是一个很长的清单,并不觉得我是最优雅的解决方案.任何人都有更优雅或更简单的方式来实现这个?

            switch (ReadDecision)
            {
                case ReadDecisions.ReadNext:
                    {
                        if (UseTimeout)
                        {
                            Message = queue.Receive(Timeout);
                        }
                        else
                        {
                            Message = queue.Receive();
                        }
                        break;
                    }
                case ReadDecisions.PeekNext:
                    {
                        if (UseTimeout)
                        {
                            Message = queue.Peek(Timeout);
                        }
                        else
                        {
                            Message = queue.Peek();
                        }
                        break;
                    }
                case ReadDecisions.ReadMessageId:
                    {
                        if (UseTimeout)
                        {
                            Message = queue.ReceiveById(Id, Timeout);
                        }
                        else
                        {
                            Message = queue.ReceiveById(Id);
                        }
                        break;
                    }
                case ReadDecisions.PeekMessageId:
                    {
                        if (UseTimeout)
                        {
                            Message = queue.PeekById(Id, Timeout);
                        }
                        else
                        {
                            Message = queue.PeekById(Id);
                        }
                        break;
                    }
                case ReadDecisions.ReadCorrelationId:
                    {
                        if (UseTimeout)
                        {
                            Message = queue.ReceiveByCorrelationId(Id, Timeout);
                        }
                        else
                        {
                            Message = queue.ReceiveByCorrelationId(Id);
                        }
                        break;
                    }
                case ReadDecisions.PeekCorrelationId:
                    {
                        if (UseTimeout)
                        {
                            Message = queue.PeekByCorrelationId(Id, Timeout);
                        }
                        else
                        {
                            Message = queue.PeekByCorrelationId(Id);
                        }
                        break;
                    }
                default:
                    {
                        throw new Exception("Unknown ReadDecisions provided");
                    }
            }
Run Code Online (Sandbox Code Playgroud)

lc.*_*lc. 5

根据什么queue是,你可以改变的签名Peek(),并Peek(bool)Peek(bool?)?(其他方法也应该遵循.)

那样,而不是:

if (UseTimeout)
{
    Message = queue.Peek(Timeout);
}
else
{
    Message = queue.Peek();
}
Run Code Online (Sandbox Code Playgroud)

你可以有:

Message = queue.Peek(UseTimeout ? Timeout : null);
Run Code Online (Sandbox Code Playgroud)

另一个想法是你可以将决策结构推送到队列类:

if(UseTimeout)
    Message = queue.PerformAction(ReadDecision, Timeout)
else
    Message = queue.PerformAction(ReadDecision)
Run Code Online (Sandbox Code Playgroud)