エンタープライズ ライブラリ検証アプリケーション ブロックを使用しています。
抽象クラスA { public int fieldA; }
クラス B:A { }
タイプ B にバリデーターを追加します。フィールド fieldA を見つけることができず、構成に入力しても検証が成功しません。VAB は、抽象クラスと継承されたプロパティまたはフィールドを考慮しませんか?
エンタープライズ ライブラリ検証アプリケーション ブロックを使用しています。
抽象クラスA { public int fieldA; }
クラス B:A { }
タイプ B にバリデーターを追加します。フィールド fieldA を見つけることができず、構成に入力しても検証が成功しません。VAB は、抽象クラスと継承されたプロパティまたはフィールドを考慮しませんか?
VAB は、属性を使用する場合にのみ継承をサポートします。構成ベースの検証では、継承はサポートされていません (こちらの FAQ を参照してください)。entlib チームが提供する回避策は次のとおりです。
この問題を回避するには、サブクラスの検証仕様を複製します。
もちろん、この回避策は最悪です。基本クラスのすべての変更に対して、それを多くの派生型にコピーする必要がある可能性があるからです。これは脆く、エラーが発生しやすくなります。このため、基本クラスから実装に検証を複製できるソリューションを構築しました。
ここ Stackoverflow に投稿するにはコードが多すぎますが、それに関する私のブログ投稿はこちら で読むことができます。
これが役立つことを願っています。
私はテストを行いましたが、これは基本クラスと抽象基本クラスでうまく機能しています。構成を投稿できますか?
フィールドを扱うときは、プロパティ検証 XML を使用しないように注意してください (逆も同様です)。
上記のサンプルに基づいて、構成は次のようになります。
<validation>
<type assemblyName="MyProject.Test, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
name="MyProject.Test.B">
<ruleset name="RuleSetB">
<fields>
<field name="fieldA">
<validator lowerBound="1" lowerBoundType="Inclusive" upperBound="100"
upperBoundType="Inclusive" negated="false" messageTemplate="fieldA must be between 1 and 100"
messageTemplateResourceName="" messageTemplateResourceType=""
tag="" type="Microsoft.Practices.EnterpriseLibrary.Validation.Validators.RangeValidator, Microsoft.Practices.EnterpriseLibrary.Validation, Version=4.1.0.0, Culture=neutral, PublicKeyToken=null"
name="Range Validator" />
</field>
</fields>
</ruleset>
</type>
</validation>