您也许可以使用反射来修改您感兴趣的验证器属性。但这确实很混乱而且很混乱。
如果您只是在验证后替换验证结果上的消息文本怎么办?
配置文件中的消息可以是占位符(例如 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)
。