将适当类型转换为传递给IsValid方法的对象

时间:2013-06-07 14:53:25

标签: c# validation reflection

版:

我为了存档而留下这个问题,但是我应该删除它。这完全是我的错,我做错了几件事。首先,我重用了RequiredIf验证中的代码,但是我应该删除_innerAttribute,如果与之相关,那就是我忘记做的最内层。最主要的是我试图将枚举与字符串进行比较,这就是为什么它失败但是如果我将构造函数传递给相应的枚举成员,代码实际上工作正常。我完全误解了对象的行为,演员......

版本结束

我正在尝试编写一个自定义验证属性,如果另一个字段不为null,则该属性不允许将字段设置为特定值。我写过这个(我省略了实现IClientVAlidatable的部分)

public class NotAllowedIfNotNullAttribute : ValidationAttribute, IClientValidatable
{
    private readonly RequiredAttribute _innerAttribute = new RequiredAttribute();

    public string DependentProperty { get; set; }
    public object NotAllowedValue { get; set; }

    public NotAllowedIfNotNullAttribute(string dependentProperty, object notAllowedValue)
    {
        DependentProperty = dependentProperty;
        NotAllowedValue = notAllowedValue;
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        var typedValue = CastValue(value, _valueType)
        ;
        var containerType = validationContext.ObjectInstance.GetType();

        var field = containerType.GetProperty(DependentProperty);

        if (field != null)
        {
            var dependentvalue = field.GetValue(validationContext.ObjectInstance, null);

            if ((dependentvalue != null && value.Equals(NotAllowedValue)))
            {
                if (!_innerAttribute.IsValid(value))
                    return new ValidationResult(ErrorMessage, new[] { validationContext.MemberName });
            }
        }

        return ValidationResult.Success;
    }
    //.....
}

我的问题是value.Equals(NotAllowedValue),我怎样才能获得转换为notAllowedValue类型的值?我试图将这种类型作为一个参数传递但我需要在这种方法中更多地工作,因为我暂时没有运气

谢谢!

1 个答案:

答案 0 :(得分:0)

也许你应该尝试使用模板?

public class NotAllowedIfNotNullAttribute<T> : ValidationAttribute, IClientValidatable
    {
        private readonly RequiredAttribute _innerAttribute = new RequiredAttribute();

        public string DependentProperty { get; set; }
        public T NotAllowedValue { get; set; }

        public NotAllowedIfNotNullAttribute(string dependentProperty, T notAllowedValue)
        {
            DependentProperty = dependentProperty;
            NotAllowedValue = notAllowedValue;
        }

        protected override ValidationResult IsValid(T value, ValidationContext validationContext)
...