繁体   English   中英

是否可以在C#中限制公共枚举值?

[英]Is it possible to restrict public enum values in C#?

我目前正在编写一个由展览组成的旅游软件程序。 展览对象在任何给定点都处于四种状态之一,由ExhibitStates枚举定义:

private enum ExhibitState { Ready, Active, Complete, Inactive };

对于将要设置展品的开发人员,我只希望他们可以选择两种“起始”状态:

public enum StartingExhibitState { Ready, Inactive };

目前,我设置它,以便在初始化时,展览将立即设置其状态以匹配其起始状态,如下所示:

        switch (startingState) {
            case StartingExhibitState.Ready:
                SetState(ExhibitState.Ready);
                break;
            case StartingExhibitState.Inactive:
                SetState(ExhibitState.Inactive);
                break;
        }

我发现自己今天想知道这是不是最好的做法。 有没有更好的方法来限制哪些枚举选项是公开的,哪些是私有的? 或者最好是简单地使用两个单独的枚举?

非常感谢您的参与。

如果您创建第二个枚举 - 您的意图将通过设置方法的签名非常清楚地解释

public enum ExhibitState 
{ 
    Inactive = 0,
    Active = 1,
    Ready = 2,
    Complete = 3
};

public enum InitialStates 
{ 
    Inactive = ExhibitState.Inactive,
    Ready = ExhibitState.Ready
};

public void SetInitial(InitialStates state)
{
    SetState((ExhibitState)state);
}

如果您更进一步,可以添加编译器帮助以防止将错误的值传递给方法。

public sealed class InitialState
{
    public static readonly InitialState Initial = new InitialState(ExhibitState.Initial);

    public static readonly InitialState Ready = new InitialState(ExhibitState.Ready);

    public ExhibitState State { get; }            

    private InitialState(ExhibitState state)
    {
        State = state;
    }
}

构造函数是private以防止从其他地方实例化类。
标记为sealed类,以防止导出和改变它的行为。

然后你的方法看起来像

public void SetInitial(InitialState start)
{
    SetState(start.State);
}  

// use it
SetInitial(InitialState.Initial);
SetInitial(InitialState.Ready);

在更改InitialState类的代码之前,不能传递任何其他InitialState

您可以使用基于类的方法,而不是使用枚举(或其中两个):

public abstract class ExhibitState 
{
    public static ExhibitInitialState Ready { get { return new ExhibitReadyState(); } }
    public static ExhibitInitialState Inactive { get { return new ExhibitInactiveState(); } }
    public static ExhibitState Complete { get { return new ExhibitCompleteState(); } }
    public static ExhibitState Active { get { return new ExhibitActiveState(); } }

    private class ExhibitReadyState : ExhibitInitialState {}
    private class ExhibitInactiveState : ExhibitInitialState {}
    private class ExhibitCompleteState : ExhibitState {}
    private class ExhibitActiveState : ExhibitState {}
}

public abstract class ExhibitInitialState : ExhibitState {}

上面的示例显示了一种简单的方法。 通常,您不会在get方法中创建状态的新实例,而是具有静态实例,以便比较更容易。

与枚举类似,您仍然可以键入ExhibitState.Ready或其他状态。 此外,基类ExhibitInitialState允许您限制最初可以设置的状态:

public void SetInitial(ExhibitInitialState initState) { ... }

与@Fabio提出的方法相比,您可以获得无法混淆价值的好处。 此外,尤其与州相关:非常普遍的是,行为也应该针对特定国家而改变。 使用这种基于类的方法,您可以在特定的ExhibitState实现中实现此行为,并避免使用基于枚举的方法中可能存在的大量switch语句。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM