Пример #1
0
        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
            if (value != null)
            {
                if (value.ToString().Equals(ValueToCompare.ToString()))
                {
                    return(new ValidationResult(
                               FormatErrorMessage(validationContext.DisplayName), new[] { validationContext.MemberName }));
                }
            }

            return(ValidationResult.Success);
        }
        public virtual void Compare(object entity, Action <string> onFail)
        {
            var entityValue = Property.GetValue(entity, null);

            if (ExternalLibraryBoundary.IsThisAnEntityObject(ValueToCompare))
            {
                if (ExternalLibraryBoundary.AreTheseTheSameEntity(ValueToCompare, entityValue))
                {
                    onFail(String.Format("References for property {0} do not match.\n Expected ID {1}\n got {2}",
                                         Property.Name,
                                         ExternalLibraryBoundary.GetValueOfId(ValueToCompare),
                                         ExternalLibraryBoundary.GetValueOfId(entityValue)));
                }
            }
            else if (!ValueToCompare.Equals(entityValue))
            {
                onFail(String.Format("Values for property {0} did not match. {1} != {2}", Property.Name,
                                     ValueToCompare, entityValue));
            }
        }
        /// <summary>
        /// Determine if the input values matches, depending on the input operator and options.
        /// </summary>
        /// <param name="provider">An IFormatProvider interface implementation that supplies culture-specific formatting information.</param>
        /// <returns>true if the values matches; false otherwise.</returns>
        public virtual bool Matches(IFormatProvider provider)
        {
            bool   ret = false;
            string v;
            string vtc;
            UniversalConverterInput clone;

            switch (Operator)
            {
            case UniversalConverterOperator.Equal:
                if (Value == null)
                {
                    if (ValueToCompare == null)
                    {
                        ret = true;
                        break;
                    }

                    // use string comparison (to compare "" to null or similar)
                    v   = ValueToCompareToString(provider, false);
                    ret = v == null;
                    break;     // false
                }

                if (Value.Equals(ValueToCompare))
                {
                    ret = true;
                    break;
                }

                v = Value as string;
                if (v != null)
                {
                    vtc = ValueToCompareToString(provider, true);
                    ret = string.Compare(v, vtc, StringComparison) == 0;
                    break;
                }

                if ((Options & UniversalConverterOptions.Convert) == UniversalConverterOptions.Convert)
                {
                    object cvalue;
                    if (ConversionService.TryChangeType(ValueToCompare, Value.GetType(), provider, out cvalue))
                    {
                        if (Value.Equals(cvalue))
                        {
                            ret = true;
                            break;
                        }

                        if (Value.GetType() == typeof(string))
                        {
                            string sv = (string)cvalue;
                            if ((Options & UniversalConverterOptions.Trim) == UniversalConverterOptions.Trim)
                            {
                                sv = sv.Trim();
                            }

                            if ((Options & UniversalConverterOptions.Nullify) == UniversalConverterOptions.Nullify)
                            {
                                if (sv.Length == 0)
                                {
                                    sv = null;
                                }
                            }

                            if (Value.Equals(sv))
                            {
                                ret = true;
                                break;
                            }
                        }
                    }
                }
                break;

            case UniversalConverterOperator.NotEqual:
                clone          = Clone();
                clone.Operator = UniversalConverterOperator.Equal;
                ret            = clone.Matches(provider);
                break;

            case UniversalConverterOperator.Contains:
                v = ValueToString(provider);
                if (v == null)
                {
                    break;
                }

                vtc = ValueToCompareToString(provider, true);
                if (vtc == null)
                {
                    break;
                }

                ret = v.IndexOf(vtc, StringComparison) >= 0;
                break;

            case UniversalConverterOperator.StartsWith:
                v = ValueToString(provider);
                if (v == null)
                {
                    break;
                }

                vtc = ValueToCompareToString(provider, true);
                if (vtc == null)
                {
                    break;
                }

                ret = v.StartsWith(vtc, StringComparison);
                break;

            case UniversalConverterOperator.EndsWith:
                v = ValueToString(provider);
                if (v == null)
                {
                    break;
                }

                vtc = ValueToCompareToString(provider, true);
                if (vtc == null)
                {
                    break;
                }

                ret = v.EndsWith(vtc, StringComparison);
                break;

            case UniversalConverterOperator.LesserThanOrEqual:
            case UniversalConverterOperator.LesserThan:
            case UniversalConverterOperator.GreaterThanOrEqual:
            case UniversalConverterOperator.GreaterThan:
                var cv = Value as IComparable;
                if (cv == null || ValueToCompare == null)
                {
                    break;
                }

                IComparable cvtc;
                if (!Value.GetType().IsAssignableFrom(ValueToCompare.GetType()))
                {
                    cvtc = ConversionService.ChangeType(ValueToCompare, Value.GetType(), provider) as IComparable;
                }
                else
                {
                    cvtc = ValueToCompare as IComparable;
                }
                if (cvtc == null)
                {
                    break;
                }

                int comparison;
                v = Value as string;
                if (StringComparison != StringComparison.CurrentCulture)     // not the default? use the special string comparer
                {
                    vtc        = ValueToCompareToString(provider, true);
                    comparison = string.Compare(v, vtc, StringComparison);
                }
                else
                {
                    comparison = cv.CompareTo(cvtc);
                }

                if (comparison == 0)
                {
                    ret = Operator == UniversalConverterOperator.GreaterThanOrEqual || Operator == UniversalConverterOperator.LesserThanOrEqual;
                    break;
                }

                if (comparison < 0)
                {
                    ret = Operator == UniversalConverterOperator.LesserThan || Operator == UniversalConverterOperator.LesserThanOrEqual;
                    break;
                }

                ret = Operator == UniversalConverterOperator.GreaterThan || Operator == UniversalConverterOperator.GreaterThanOrEqual;
                break;

            case UniversalConverterOperator.Between:
                clone = Clone();
                clone.ValueToCompare = MinimumValue;
                clone.Operator       = UniversalConverterOperator.GreaterThanOrEqual;
                if (!clone.Matches(provider))
                {
                    break;
                }

                clone = Clone();
                clone.ValueToCompare = MaximumValue;
                clone.Operator       = UniversalConverterOperator.LesserThan;
                ret = clone.Matches(provider);
                break;

            case UniversalConverterOperator.IsType:
            case UniversalConverterOperator.IsOfType:
                Type tvtc = ValueToCompareToType(provider);
                if (tvtc == null)
                {
                    break;
                }

                if (Value == null)
                {
                    if (tvtc.IsValueType)
                    {
                        break;
                    }

                    ret = (Options & UniversalConverterOptions.NullMatchesType) == UniversalConverterOptions.NullMatchesType;
                    break;
                }

                if (Operator == UniversalConverterOperator.IsType)
                {
                    ret = Value.GetType() == tvtc;
                }
                else
                {
                    ret = tvtc.IsAssignableFrom(Value.GetType());
                }
                break;
            }

            return(Reverse ? !ret : ret);
        }