在阅读了您在 Mehrdad 的回答中的评论后,我想我对您的问题有了更好的理解。
您似乎担心开发人员在他们正在编写的类中访问私有状态、绕过您的验证逻辑等的能力。这表明状态根本不应该包含在类中。
我建议以下策略。编写一个表示 ValidatedValue 的泛型类。此类仅包含支持值,并且仅允许通过 get 和 set 方法进行访问/更改。将委托传递给 ValidatedValue 以表示验证逻辑:
public class ValidatedValue< T >
{
private T m_val;
public ValidationFn m_validationFn;
public delegate bool ValidationFn( T fn );
public ValidatedValue( ValidationFn validationFn )
{
m_validationFn = validationFn;
}
public T get()
{
return m_val;
}
public void set(T v)
{
if (m_validationFn(v))
{
m_val = v;
}
}
}
当然,您可以根据需要添加更多代表(例如,支持更改前/后通知)。
您的班级现在将使用 ValidatedValue 代替您的财产的后备存储。
下面的示例显示了一个类 MyClass,其整数被验证为小于 100。请注意,引发异常的逻辑在 MyClass 中,而不是 ValidatedValue。这允许您执行复杂的验证规则,这些规则依赖于 MyClass 中包含的其他状态。Lambda 表示法用于构造验证委托 - 您可以改为绑定到成员函数。
public partial class MyClass
{
private ValidatedValue<int> m_foo;
public MyClass()
{
m_foo = new ValidatedValue<int>(
v =>
{
if (v >= 100) RaiseError();
return true;
}
);
}
private void RaiseError()
{
// Put your logic here....
throw new NotImplementedException();
}
public int Foo
{
get { return m_foo.get(); }
set { m_foo.set(value); }
}
}
希望这会有所帮助 - 有点偏离原始主题,但我认为它更符合您的实际担忧。我们所做的是将验证逻辑从属性中取出,并将其放在数据上,这正是您想要的。