如何根据当前值指定枚举可以具有的值?

时间:2019-06-03 12:35:16

标签: c# enums

我正在寻找一种指定let的方法,称为“决策树”或“流程”。

我的起始值为1或REQUESTED,并且该枚举可以具有多个后续值,例如2或IN_PROGRESS或3或DECLINED。

现在只有从值2开始,才有可能将值设为4或FINISHED之类的较高值。

定义过程或流可能具有的路径的最实际方法是什么?

2 个答案:

答案 0 :(得分:2)

实用知识通常是最容易理解的内容。为此,我建议明确指出哪些状态可以导致其他状态。 enum只是可能值的列表。使用int的{​​{1}}值看似更简洁,但更难阅读,并可能导致其他问题。

首先,这是一个enum和一个简单的类,如果允许更改,则该类将从一种状态更改为另一种状态。 (我没有涵盖每个州。)

enum

如果我们将其基于enum RequestState { Requested, InProgress, Declined, Finished } public class Request { private RequestState _state = RequestState.Requested; public void BeginWork() { if (_state == RequestState.Declined || _state == RequestState.Finished) throw new InvalidOperationException("You can only begin work on a new request."); _state = RequestState.InProgress; } public void Decline() { if (_state == RequestState.Finished) throw new InvalidOperationException("Too late - it's finished!"); _state = RequestState.Declined; } // etc. } 的数值并确定该数字只能递增,则可能会出错:

  • 有人可以重新排列枚举或添加一个新的枚举,而无需知道数字值或位置是否具有逻辑意义。这是一个容易犯的错误,因为该值通常并不重要。
  • 您可能需要实现不太简单的逻辑。您可能需要一个状态,该状态之前可以带有一些值,但不是全部。
  • 您可能会意识到有一个倒退的正当理由。如果请求被拒绝,将来您确定要重新打开请求,将其有效地发送回_state,该怎么办?

如果实现该方法的方法有些怪异,那么这些更改可能使更改和遵循变得更加困难。但是,如果您只清楚地描述在任何状态下可能发生的变化,那么将易于阅读和修改。

答案 1 :(得分:0)

可以做一些事情来利用枚举基本上只是整数:

private static Status NextState(Status status)
{
    var intOfStatus = ((int)status) + 1;
    return (Status)intOfStatus;
}

以及基于此方法的一些示例逻辑:

public enum Status
{
    NotStarted = 0,
    Started = 1,
    InProgress = 2,
    Declined = 3
}
public static void Main()
{
    var curStatus = Status.NotStarted;

    Console.WriteLine(curStatus.ToString()); //writes 'NotStarted'

    if ((int)curStatus++ == (int)Status.Started)
    {
        curStatus = Status.Started; 
    }

    Console.WriteLine(NextState(curStatus)); //writes 'InProgress'
}