| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 | using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.ComponentModel;using System.ComponentModel.DataAnnotations;using System.Reflection;namespace MECF.Framework.UI.Client.ClientBase{    public class DataErrorInfo<T>       : IDataErrorInfo where T : class    {        private readonly T ImplementorInstance;        private Dictionary<string, Func<T, object>> PropertyGetterMap;        private Dictionary<string, ValidationAttribute[]> ValidatorMap;        private bool HasInitialisedValidator;        public DataErrorInfo(T implementator)        {            ImplementorInstance = implementator;        }        #region Implementation of IDataErrorInfo        public string this[string propertyName]        {            get            {                if (!HasInitialisedValidator) InitialiseValidators();                if (PropertyGetterMap.ContainsKey(propertyName))                {                    var propertyValue = PropertyGetterMap[propertyName](ImplementorInstance);                    var errorMessages = ValidatorMap[propertyName]                        .Where(v => !v.IsValid(propertyValue))                        .Select(v => v.ErrorMessage).ToArray();                    return string.Join(Environment.NewLine, errorMessages);                }                return string.Empty;            }        }        public string Error        {            get            {                if (!HasInitialisedValidator) InitialiseValidators();                var errors = from validator in ValidatorMap                             from attribute in validator.Value                             where !attribute.IsValid(PropertyGetterMap[validator.Key](ImplementorInstance))                             select attribute.ErrorMessage;                return string.Join(Environment.NewLine, errors.ToArray());            }        }        private void InitialiseValidators()        {            HasInitialisedValidator = true;            ValidatorMap = ImplementorInstance.GetType()                .GetProperties()                .Where(p => GetValidations(p).Length != 0)                .ToDictionary(p => p.Name, GetValidations);            PropertyGetterMap = ImplementorInstance.GetType()                .GetProperties()                .Where(p => GetValidations(p).Length != 0)                .ToDictionary(p => p.Name, GetValueGetter);        }        private static ValidationAttribute[] GetValidations(PropertyInfo property)        {            return (ValidationAttribute[])property.GetCustomAttributes(typeof(ValidationAttribute), true);        }        private static Func<T, object> GetValueGetter(PropertyInfo property)        {            return viewmodel => property.GetValue(viewmodel, null);        }        #endregion Implementation of IDataErrorInfo    }}
 |