使用枚举的一部分进行内部使用?

时间:2012-01-04 16:09:44

标签: c# enums

我想知道什么是解决这个问题的好方法,
我有一个暴露枚举的类:(这只是一个例子)

public class Foo
{
    public State FooState { get; private set; }
    public string SomeData { get; set; }

    public Foo(State state)
    {
        FooState = state;
    }

    public Foo()
    {           
    }

    public enum State
    {
        None,
        Bad,
        Good
    }
}

在一次使用该类时,用户可以调整状态,另一方面他不能这样状态设置为NONE并且那个好但我不希望用户有可能将其设置为None。我知道显然没有一个内部枚举字段,有没有办法可以做其他事情,因为规范,Foo类无法改变。

澄清 类不能改变的意思是类的设计和目的不能改变,而不是类本身。

只有当c'tor获得一个值时才会使用该类的状态。由于将来使用反射,我无法使用两个类或使用接口。 (我只是不能使用typeof)

2 个答案:

答案 0 :(得分:2)

我相信你可以通过提供两个具有不同访问级别的接口来实现这一点,明确地实现它们而不是Foo类型使用其中一个接口进行只读或完全访问。

由于Foo无法更改,您可以使用Wrapper方法:

Foo foo = new Foo(State.Good);
FooWrapper fooWrapper = new FooWrapper(foo);

// would be read-write
(FooWrapper as IReaonlyState).State

// would be readonly
(FooWrapper as IWritableState).State


public interface IReadonlyState
{
    State FooState { get; }
}

public interface IWritableState
{
    State FooState { get; set; }
}

public class FooWrapper : IReadonlyState, IWritableState
{
    Foo foo;

    public FooWrapper(Foo foo)
    { 
       this.foo = foo;
    }

   State IReadonlyState.FooState
   {
      get
      {
         return this.foo.FooState;
      }
   }

   State IWritableState.FooState
   {
      get
      {
         return this.foo.FooState;
      }

      set
      {
         this.foo.FooState = value;
      }
   }       
}

答案 1 :(得分:0)

因此,您希望消费者能够设置State = Bad和State = Good。 但是如果State == None你应该能够阅读,但不能改变它。听起来你需要明确地实现setter。

相关问题