Если ваша цель состоит в том, чтобы избежать использования исключений, вы можете написать собственный метод проверки:
public bool IsValidDate(int year, int month, int multiplier, int dow)
{
if (year < 1 | year > 9999) { return false; }
if (month < 1 | month > 12) { return false; }
int day = 7 * multiplier + 7 - dow;
if (day < 1 | day > DateTime.DaysInMonth(year, month)) { return false; }
return true;
}
Он выполняет большинство тех же проверок, что и используемый вами конструктор DateTime, - он только пропускает проверку, чтобы увидеть, будет ли результирующий DateTime меньше DateTime.MinValue или больше DateTime.MaxValue.
Если вы в большинстве случаев получаете хорошие значения, это, вероятно, будет в целом медленнее: DateTime.DaysInMonth должен делать то же самое, что и конструктор DateTime, поэтому он добавляет накладные расходы ко всем хорошим датам.