我想知道什么是解决这个问题的好方法,
我有一个暴露枚举的类:(这只是一个例子)
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)
答案 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。