リフレクションを使用して、関心のあるバリデーターのプロパティを変更できる場合があります。しかし、それは本当に厄介で厄介です。
検証後に検証結果のメッセージ テキストを単純に置き換えたらどうなるでしょうか。
構成ファイル内のメッセージはプレースホルダー (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));
}
アップデート
OK、テンプレート テキストが必要な場合は、リフレクションを介して調べてみることができますが、それでも非常に面倒です。
あなたの要件 (構成ファイル、テンプレートの維持) を考えると、私がおそらく行うことは、それぞれが必要なテンプレート テキストを含む複数の構成ファイルを作成することです。
これはちょっとしたメンテナンスの悪夢なので、そのアイデアを次のように改良します。
構成ファイル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)
。