首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按接口应用自定义Validator

按接口应用自定义Validator
EN

Stack Overflow用户
提问于 2013-01-09 14:36:58
回答 2查看 1.7K关注 0票数 2

假设我有一个接口:

代码语言:javascript
复制
public interface ISomeInterface
{
    bool SomeBool { get; set; }

    string ValueIfSomeBool { get; set; }
}

我有很多类可以实现这一点。即

代码语言:javascript
复制
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; }
}

我在自定义验证器中对这个接口的属性有一个验证逻辑,如下所示:

代码语言:javascript
复制
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。

代码语言:javascript
复制
[AttributeUsage(AttributeTargets.Interface)]
internal class SomeInterfaceValidatorAttribute : ValidatorAttribute
{
    protected override Validator DoCreateValidator(Type targetType)
    {
        return new SomeInterfaceValidator(this.Tag);
    }
}

当我调用Validation.Validate时,它似乎没有触发SomeInterfaceValidator中的验证。它执行特定于ClassA的验证,但不执行接口ISomeInterface的验证。

我怎么才能让这个起作用?

编辑:--我找到了一种让它工作的方法,那就是执行SelfValidation,在这里,我转换为ISomeInterface并像这样进行验证。这样就足够了,但问题仍然有待解决,看看是否还有其他方法来实现这一目标。

代码语言:javascript
复制
    [SelfValidation]
    public void DoValidate(ValidationResults results)
    {
        results.AddAllResults(Validation.Validate((ISomeInterface)this));
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-09 15:17:46

这是验证应用程序块的一个限制。这是一个描述如何为VAB添加Validator继承的文章。

票数 0
EN

Stack Overflow用户

发布于 2013-01-10 00:11:52

验证接口的一种方法是使用ValidationFactory为接口创建一个Validator,而不是使用基于具体类型的Validator.Validate()静态外观或CreateValidator()。例如,考虑到您的方法,这应该是可行的:

代码语言:javascript
复制
var validator = ValidationFactory.CreateValidator<ISomeInterface>();
ValidationResults validationResults = validator.Validate(someInterfaceInstance);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14237600

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档