Прочитав ваши комментарии в ответе Мехрдада, я думаю, что немного лучше понимаю вашу проблему.
Похоже, что вы обеспокоены возможностью разработчика получить доступ к частному состоянию в классе, который они пишут, в обход вашей логики проверки и т. Д. Это предполагает, что состояние вообще не должно содержаться в классе.
Я бы предложил следующую стратегию. Напишите универсальный класс, который представляет 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. Лямбда-нотация использовалась для создания делегата валидации - вместо этого вы могли бы привязаться к функции-члену.
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); }
}
}
Надеюсь, это поможет - несколько не в тему оригинала, но я думаю, что это больше соответствует вашим актуальным проблемам. То, что мы сделали, это взяли логику проверки из свойства и поместили ее в данные, где вы и хотели.