using System; using System.Collections.Generic; using System.ComponentModel; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Reflection; namespace OpenSEMI.ClientBase { public class DataErrorInfo : IDataErrorInfo where T : class { private readonly T ImplementorInstance; private Dictionary> PropertyGetterMap; private Dictionary ValidatorMap; private bool HasInitialisedValidator; public string this[string propertyName] { get { if (!HasInitialisedValidator) { InitialiseValidators(); } if (PropertyGetterMap.ContainsKey(propertyName)) { object propertyValue = PropertyGetterMap[propertyName](ImplementorInstance); string[] value = Enumerable.ToArray(Enumerable.Select(Enumerable.Where((IEnumerable)ValidatorMap[propertyName], (Func)((ValidationAttribute v) => !v.IsValid(propertyValue))), (Func)((ValidationAttribute v) => v.ErrorMessage))); return string.Join(Environment.NewLine, value); } return string.Empty; } } public string Error { get { if (!HasInitialisedValidator) { InitialiseValidators(); } IEnumerable source = Enumerable.Select(Enumerable.Where(Enumerable.SelectMany((IEnumerable>)ValidatorMap, (Func, IEnumerable>)((KeyValuePair validator) => validator.Value), (KeyValuePair validator, ValidationAttribute attribute) => new { validator, attribute }), _003C_003Eh__TransparentIdentifier0 => !_003C_003Eh__TransparentIdentifier0.attribute.IsValid(PropertyGetterMap[_003C_003Eh__TransparentIdentifier0.validator.Key](ImplementorInstance))), _003C_003Eh__TransparentIdentifier0 => _003C_003Eh__TransparentIdentifier0.attribute.ErrorMessage); return string.Join(Environment.NewLine, Enumerable.ToArray(source)); } } public DataErrorInfo(T implementator) { ImplementorInstance = implementator; } private void InitialiseValidators() { HasInitialisedValidator = true; ValidatorMap = Enumerable.ToDictionary(Enumerable.Where((IEnumerable)ImplementorInstance.GetType().GetProperties(), (Func)((PropertyInfo p) => GetValidations(p).Length != 0)), (Func)((PropertyInfo p) => p.Name), (Func)GetValidations); PropertyGetterMap = Enumerable.ToDictionary>(Enumerable.Where((IEnumerable)ImplementorInstance.GetType().GetProperties(), (Func)((PropertyInfo p) => GetValidations(p).Length != 0)), (Func)((PropertyInfo p) => p.Name), (Func>)GetValueGetter); } private static ValidationAttribute[] GetValidations(PropertyInfo property) { return (ValidationAttribute[])property.GetCustomAttributes(typeof(ValidationAttribute), true); } private static Func GetValueGetter(PropertyInfo property) { return (T viewmodel) => property.GetValue(viewmodel, null); } } }