Mercurial > pub > bltoolkit
diff Source/Validation/Validator.cs @ 0:f990fcb411a9
Копия текущей версии из github
author | cin |
---|---|
date | Thu, 27 Mar 2014 21:46:09 +0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Source/Validation/Validator.cs Thu Mar 27 21:46:09 2014 +0400 @@ -0,0 +1,212 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; + +using BLToolkit.Reflection; + +namespace BLToolkit.Validation +{ + public class Validator + { + #region Validate + + public static void Validate(ValidationContext context) + { + foreach (MemberAccessor ma in context.TypeAccessor) + { + var attrs = ma.GetAttributes<ValidatorBaseAttribute>(); + + if (attrs == null) + continue; + + context.MemberAccessor = ma; + context.Value = ma.GetValue(context.Object); + + for (var i = 0; i < attrs.Length; i++) + { + var attr = attrs[i]; + if (attr.IsValid(context) == false) + throw new ValidationException(attr.GetErrorMessage(context)); + } + } + } + + public static void Validate(object obj, ValidationContext.IsNullHandler isNull) + { + Validate(InitContext(null, obj, null, isNull)); + } + + public static void Validate(object obj) + { + Validate(obj, null); + } + + #endregion + + #region Protected Members + + private static bool IsNullInternal(ValidationContext context) + { + if (context.Value == null) + return true; + + if (context.NullValue is DBNull) + return false; + + return context.NullValue.Equals(context.Value); + } + + public static ValidationContext InitContext( + ValidationContext context, + object obj, + PropertyDescriptor pd, + ValidationContext.IsNullHandler isNull) + { + if (context == null) + context = new ValidationContext(); + + context.Object = obj; + context.IsNull = isNull ?? new ValidationContext.IsNullHandler(IsNullInternal); + context.PropertyDescriptor = pd; + + return context; + } + + #endregion + + #region IsValid + + public static bool IsValid(ValidationContext context, string fieldName) + { + ValidatorBaseAttribute[] attrs = null; + object value = null; + +#if !SILVERLIGHT + + if (context.PropertyDescriptor != null) + { + value = context.PropertyDescriptor.GetValue(context.Object); + + List<ValidatorBaseAttribute> list = null; + + foreach (var o in context.PropertyDescriptor.Attributes) + { + if (o is ValidatorBaseAttribute) + { + if (list == null) + list = new List<ValidatorBaseAttribute>(); + + list.Add((ValidatorBaseAttribute)o); + } + } + + if (list != null) + attrs = list.ToArray(); + } + else + +#endif + + { + context.MemberAccessor = context.TypeAccessor[fieldName]; + + if (context.MemberAccessor != null) + { + value = context.MemberAccessor.GetValue(context.Object); + attrs = context.MemberAccessor.GetAttributes<ValidatorBaseAttribute>(); + } + } + + if (attrs != null) + { + context.Value = value; + + for (var i = 0; i < attrs.Length; i++) + { + if (!attrs[i].IsValid(context)) + return false; + } + } + + return true; + } + + public static bool IsValid(object obj, string fieldName, ValidationContext.IsNullHandler isNull) + { + return IsValid(InitContext(null, obj, null, isNull), fieldName); + } + +#if !SILVERLIGHT + + public static bool IsValid(object obj, PropertyDescriptor pd, ValidationContext.IsNullHandler isNull) + { + return IsValid(InitContext(null, obj, pd, isNull), pd.Name); + } + + public static bool IsValid(object obj, PropertyDescriptor pd) + { + return IsValid(obj, pd, null); + } + +#endif + + public static bool IsValid(object obj, string fieldName) + { + return IsValid(obj, fieldName, null); + } + + #endregion + + #region GetErrorMessages + + public static string[] GetErrorMessages(ValidationContext context, string fieldName) + { + context.MemberAccessor = context.TypeAccessor[fieldName]; + + if (context.MemberAccessor != null) + { + var messages = new List<string>(); + var attrs = context.MemberAccessor.GetAttributes<ValidatorBaseAttribute>(); + + if (attrs != null) + { + context.Value = context.MemberAccessor.GetValue(context.Object); + + for (var i = 0; i < attrs.Length; i++) + messages.Add(attrs[i].GetErrorMessage(context)); + + return messages.ToArray(); + } + } + + return new string[0]; + } + + public static string[] GetErrorMessages( + object obj, string fieldName, ValidationContext.IsNullHandler isNull) + { + return GetErrorMessages(InitContext(null, obj, null, isNull), fieldName); + } + +#if !SILVERLIGHT + + public static string[] GetErrorMessages(object obj, PropertyDescriptor pd, ValidationContext.IsNullHandler isNull) + { + return GetErrorMessages(InitContext(null, obj, pd, isNull), pd.Name); + } + + public static string[] GetErrorMessages(object obj, PropertyDescriptor pd) + { + return GetErrorMessages(obj, pd, null); + } + +#endif + + public static string[] GetErrorMessages(object obj, string fieldName) + { + return GetErrorMessages(obj, fieldName, null); + } + + #endregion + } +}