私がインターフェースを持っているとしましょう:
public interface ISomeInterface
{
bool SomeBool { get; set; }
string ValueIfSomeBool { get; set; }
}
そして、それを実装するクラスがいくつかあります。すなわち
public class ClassA : ISomeInterface
{
#region Implementation of ISomeInterface
public bool SomeBool { get; set; }
public string ValueIfSomeBool { get; set; }
#endregion
[NotNullValidator]
public string SomeOtherClassASpecificProp { get; set; }
}
そして、次のようなカスタムバリデーターにこのインターフェイスのプロパティの検証ロジックがあります。
public class SomeInterfaceValidator : Validator<ISomeInterface>
{
public SomeInterfaceValidator (string tag)
: base(string.Empty, tag)
{
}
protected override string DefaultMessageTemplate
{
get { throw new NotImplementedException(); }
}
protected override void DoValidate(ISomeInterface objectToValidate, object currentTarget, string key, ValidationResults validationResults)
{
if (objectToValidate.SomeBool &&
string.IsNullOrEmpty(objectToValidate.ValIfSomeBool))
{
validationResults.AddResult(new ValidationResult("ValIfSomeBool cannot be null or empty when SomeBool is TRUE", currentTarget, key, string.Empty, null));
}
if (!objectToValidate.SomeBool &&
!string.IsNullOrEmpty(objectToValidate.ValIfSomeBool))
{
validationResults.AddResult(new ValidationResult("ValIfSomeBool must be null when SomeBool is FALSE", currentTarget, key, string.Empty, null));
}
}
}
そして、ISomeInterfaceを装飾するこのバリデーターを適用するための属性があります。
[AttributeUsage(AttributeTargets.Interface)]
internal class SomeInterfaceValidatorAttribute : ValidatorAttribute
{
protected override Validator DoCreateValidator(Type targetType)
{
return new SomeInterfaceValidator(this.Tag);
}
}
Validation.Validateを呼び出すと、SomeInterfaceValidatorで検証が実行されていないようです。ClassAに固有の検証を行いますが、インターフェイスISomeInterfaceの検証は行いません。
これを機能させるにはどうすればよいですか?
編集: これを機能させる1つの方法を見つけました。それは、SelfValidationを実行することです。ここで、ISomeInterfaceにキャストし、そのように検証します。これで十分ですが、これを達成する他の方法があるかどうかを確認するために、質問を開いたままにしておきます。
[SelfValidation]
public void DoValidate(ValidationResults results)
{
results.AddAllResults(Validation.Validate((ISomeInterface)this));
}