あなたがエラーを取得している理由はかなり単純です:あなたは、 StringLengthValidator
を文字列ではない型(実際はMyProperty<string>
)に対して使用しようとしています。
質問はプロパティを検証するために何をするのですか?バリデーション・アプリケーション・ブロックの設計では、デザインが実際にはうまく適合しないため、扱いにくいです。
は通常、あなただけのMyProperty
クラスを検証するためにObjectValidator
を適用するだろうが、それはあなたが本当に適用することはできませんので、異なるルールでそれぞれ様々な値を保持するためにMyProperty
を使用することを目指すように見えるので、それは本当にこの場合には収まりませんバリデータの属性はMyProperty
です。
私はあなたがカスタムバリデーターで何を望むかを達成できると思います。私はあなたのカスタムバリデータの中に既存のバリデータをラップすることができると思っています。
ここで私はMyProperty
のようなものに見えると仮定しています:そして、あなたはカスタム検証MyPropertyValidatorを作成することができます
public class MyProperty<T>
{
public T Value { get; set; }
}
を:
public class MyPropertyValidatorAttribute : ValidatorAttribute
{
Microsoft.Practices.EnterpriseLibrary.Validation.Validator validator;
public MyPropertyValidatorAttribute(Type validator, params object[] validatorArgs)
{
this.validator = Activator.CreateInstance(validator, validatorArgs)
as Microsoft.Practices.EnterpriseLibrary.Validation.Validator;
}
protected override Microsoft.Practices.EnterpriseLibrary.Validation.Validator DoCreateValidator(Type targetType)
{
return new MyPropertyValidator(validator);
}
}
public class MyPropertyValidator : Microsoft.Practices.EnterpriseLibrary.Validation.Validator
{
Microsoft.Practices.EnterpriseLibrary.Validation.Validator validator;
public MyPropertyValidator(Microsoft.Practices.EnterpriseLibrary.Validation.Validator validator)
: this(validator.MessageTemplate, validator.Tag)
{
this.validator = validator;
}
public MyPropertyValidator(string message, string tag) : base(message, tag)
{
}
protected override string DefaultMessageTemplate
{
get { return ""; }
}
public override void DoValidate(object objectToValidate, object currentTarget, string key, ValidationResults validationResults)
{
var val = objectToValidate;
Type t = objectToValidate.GetType();
var propInfo = t.GetProperty("Value");
if (propInfo != null)
{
val = propInfo.GetValue(objectToValidate, null);
}
validator.DoValidate(val, currentTarget, key, validationResults);
}
}
次にあなたがそうのようなあなたのクラスに注釈を付けることができます:
public class BE
{
[MyPropertyValidator(
typeof(StringLengthValidator),
0, RangeBoundaryType.Ignore,
3, RangeBoundaryType.Inclusive,
"Fund City Can't be more than 3 Chars",
false)]
public MyProperty<string> FUND_CITY { get; set; }
[MyPropertyValidator(
typeof(RangeValidator),
0, RangeBoundaryType.Inclusive,
10, RangeBoundaryType.Inclusive,
"Must be between 0 and 10",
false)]
public MyProperty<int> SomeOtherProperty { get; set; }
}
私は広範囲にテストしていませんが、うまくいくようです。それにはいくつかの欠点があります:
- これは柔軟性がありません。たとえば、コンポジットバリデータやその他のより複雑なシナリオをサポートしていません。おそらくすべてのケースを実装することができますが、それは乱雑になるでしょう。
- 私の実装では、リフレクションを使用していますが、回避する方がよいでしょう。
- 値型の潜在的なボクシング
ありがとうございます。このコードを実装すると、エラー "メソッド 'Level2.MyProperty'1 [System.String、mscorlib、バージョン= 4.0.0.0、カルチャ=ニュートラル、PublicKeyToken = b77a5c561934e089]を取得しています。メソッドの中で:public override void DoValidate –
@ H.N.Mishra:あなたが 'MyProperty'クラスを投稿しなかったので、私は例のように見えるかもしれないと推測しました。 "MyProperty"で検証する必要のある実際のプロパティにプロパティ "Value"を変更する必要があります。 –
あなたに感謝!それは優雅に働いた。 –