Вы можете использовать отражение, чтобы изменить интересующие вас свойства валидатора. Но это действительно грязно и запутанно.
Что если вы просто заменили текст сообщения в результатах проверки после проверки?
Сообщение в файле конфигурации может быть заполнителем (например, NAME_INVALID_LENGTH), и вы можете заменить его своим реальным текстом.
var cfgSrc = new FileConfigurationSource("Validations.xml");
var factory = ConfigurationValidatorFactory.FromConfigurationSource(cfgSrc);
Validator val = factory.CreateValidator<MyObj>();
MyObj myObj = new MyObj();
myObj.Name = "Swiper McFoxy";
ValidationResults results = new ValidationResults();
foreach (ValidationResult result in val.Validate(myObj))
{
results.AddResult(
new ValidationResult(
GetMessage<MyObj>(result.Message, new CultureInfo("en")),
result.Target,
result.Key,
result.Tag,
result.Validator,
result.NestedValidationResults));
}
Обновление
Хорошо, если вам нужен шаблонный текст, вы можете исследовать его, размышляя, но это все еще выглядит очень грязно.
Учитывая ваши требования (файл конфигурации, поддержка шаблонов), вероятно, я бы создал несколько файлов конфигурации, каждый из которых содержал бы нужный вам шаблон.
Это что-то вроде кошмарного обслуживания, поэтому я хотел бы уточнить эту идею:
Создайте свой файл конфигурации Validations.xml
, и вместо того, чтобы помещать свой шаблонный текст, я бы использовал уникальный заполнитель для каждого сообщения (например, NAME_INVALID_LENGTH, но еще более уникально).
Затем я написал бы небольшой фрагмент кода / инструмента, который для каждой локали, которую вы поддерживаете, заменял бы уникальную метку-заполнитель на текст, специфичный для локали. И скопируйте результирующий файл в определенную локальную папку в OutDir (например, bin \ debug \ en-US \ Validations.xml). Это похоже на то, как .NET развертывает сателлитные сборки, поэтому это не так уж далеко.
Запустите инструмент выше как шаг после сборки. Инструмент может помечать заполнители, которые он не может найти, чтобы о них сообщалось во время сборки. Это должно помочь синхронизировать заполнители и текст шаблона.
Измените код, чтобы использовать файл конфигурации для конкретной локали:
CultureInfo culture = new CultureInfo("en-us");
var cfgSrc = new FileConfigurationSource(culture.Name + @"\Validations.xml");
var factory = ConfigurationValidatorFactory.FromConfigurationSource(cfgSrc);
Validator val = factory.CreateValidator<MyObj>();
Вы можете абстрагировать код, специфичный для культуры, за вспомогательным методом, чтобы его было легче читать и поддерживать. например GetValidationConfigurationSource(culture)
.