Подход, который вы предлагаете, указывает на то, что набор проверки не должен применяться всегда. Что в порядке. Я видел множество правил и проверок, которые мы хотим «большую часть времени», но не всегда. Таким образом, возникает вопрос: «Когда вы хотите применить эти проверки»?
Скажем, например, у вас есть некоторые проверки, которые вы всегда хотите применить, а некоторые вы хотите проверить только тогда, когда ... я не знаю ... вы собираетесь сохранить в хранилище (база данных).
В этом случае проверки, которые применяются всегда, должны быть в свойствах (см. Подробнее об этом ниже), а проверки, которые применяются только тогда, когда вы собираетесь сохранить в хранилище, должны быть в методе (может быть назван в виде строки ' VerifyRulesForStorage '), который будет вызываться при необходимости (например, в середине вашего метода SaveToStorage).
Одна вещь, на которую стоит обратить внимание, я думаю, это дублирование, которое вы рискуете получить, когда у вас одинаковая проверка на нескольких объектах. Будь то в свойстве или в методе «VerifyRulesForStorage», вполне вероятно, что у вас будет одна и та же проверка (например, String.IsNullOrEmpty, CheckItsANumber, CheckItsOneOfTheAcceptedValues и т. Д.) Во многих местах во многих классах.
Конечно, вы можете решить эту проблему с помощью наследования (например, все ваши сущности наследуют от базового класса Entity, в котором есть методы, реализующие каждый тип проверки) или композиции (возможно, это лучший подход, так что дерево классов ваших сущностей управляется другими, более уместны соображения, например: все ваши сущности имеют объект Validator, который реализует все эти проверки).
В любом случае, вы можете захотеть держаться подальше от статических методов, так как они, как правило, создают проблемные ситуации, если вы управляем тестом (есть способы обхода, когда это необходимо).
В нашей системе у нас фактически есть метаданные, описывающие правила проверки. Имя свойства класса используется для получения правильных метаданных, которые затем сообщают системе, какие правила применять. Затем у нас есть объект-валидатор, который создает экземпляр соответствующего типа объекта для фактической проверки с помощью фабрики (например, у нас есть один класс, реализующий правило IsRequiredString, другой, реализующий правило IsNumber и т. Д. И т. Д.). Звучит как сложность, но в такой системе, как наша, это определенно стоило того.
Наконец, готовые библиотеки могут быть хорошей альтернативой. В нашем случае они были не из-за особых требований, которые у нас были - но в целом ... есть преимущества в использовании колеса, которое кто-то другой разработал (и поддержит), по сравнению с созданием собственного (поверьте мне, я люблю восстанавливать колеса, когда я может .. я просто говорю, что есть случаи, когда каждый подход лучше другого).