DataErrorInfo.cs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.ComponentModel.DataAnnotations;
  5. using System.Linq;
  6. using System.Reflection;
  7. namespace OpenSEMI.ClientBase
  8. {
  9. public class DataErrorInfo<T> : IDataErrorInfo where T : class
  10. {
  11. private readonly T ImplementorInstance;
  12. private Dictionary<string, Func<T, object>> PropertyGetterMap;
  13. private Dictionary<string, ValidationAttribute[]> ValidatorMap;
  14. private bool HasInitialisedValidator;
  15. public string this[string propertyName]
  16. {
  17. get
  18. {
  19. if (!HasInitialisedValidator)
  20. {
  21. InitialiseValidators();
  22. }
  23. if (PropertyGetterMap.ContainsKey(propertyName))
  24. {
  25. object propertyValue = PropertyGetterMap[propertyName](ImplementorInstance);
  26. string[] value = Enumerable.ToArray<string>(Enumerable.Select<ValidationAttribute, string>(Enumerable.Where<ValidationAttribute>((IEnumerable<ValidationAttribute>)ValidatorMap[propertyName], (Func<ValidationAttribute, bool>)((ValidationAttribute v) => !v.IsValid(propertyValue))), (Func<ValidationAttribute, string>)((ValidationAttribute v) => v.ErrorMessage)));
  27. return string.Join(Environment.NewLine, value);
  28. }
  29. return string.Empty;
  30. }
  31. }
  32. public string Error
  33. {
  34. get
  35. {
  36. if (!HasInitialisedValidator)
  37. {
  38. InitialiseValidators();
  39. }
  40. IEnumerable<string> source = Enumerable.Select(Enumerable.Where(Enumerable.SelectMany((IEnumerable<KeyValuePair<string, ValidationAttribute[]>>)ValidatorMap, (Func<KeyValuePair<string, ValidationAttribute[]>, IEnumerable<ValidationAttribute>>)((KeyValuePair<string, ValidationAttribute[]> validator) => validator.Value), (KeyValuePair<string, ValidationAttribute[]> validator, ValidationAttribute attribute) => new
  41. {
  42. validator,
  43. attribute
  44. }), _003C_003Eh__TransparentIdentifier0 => !_003C_003Eh__TransparentIdentifier0.attribute.IsValid(PropertyGetterMap[_003C_003Eh__TransparentIdentifier0.validator.Key](ImplementorInstance))), _003C_003Eh__TransparentIdentifier0 => _003C_003Eh__TransparentIdentifier0.attribute.ErrorMessage);
  45. return string.Join(Environment.NewLine, Enumerable.ToArray<string>(source));
  46. }
  47. }
  48. public DataErrorInfo(T implementator)
  49. {
  50. ImplementorInstance = implementator;
  51. }
  52. private void InitialiseValidators()
  53. {
  54. HasInitialisedValidator = true;
  55. ValidatorMap = Enumerable.ToDictionary<PropertyInfo, string, ValidationAttribute[]>(Enumerable.Where<PropertyInfo>((IEnumerable<PropertyInfo>)ImplementorInstance.GetType().GetProperties(), (Func<PropertyInfo, bool>)((PropertyInfo p) => GetValidations(p).Length != 0)), (Func<PropertyInfo, string>)((PropertyInfo p) => p.Name), (Func<PropertyInfo, ValidationAttribute[]>)GetValidations);
  56. PropertyGetterMap = Enumerable.ToDictionary<PropertyInfo, string, Func<T, object>>(Enumerable.Where<PropertyInfo>((IEnumerable<PropertyInfo>)ImplementorInstance.GetType().GetProperties(), (Func<PropertyInfo, bool>)((PropertyInfo p) => GetValidations(p).Length != 0)), (Func<PropertyInfo, string>)((PropertyInfo p) => p.Name), (Func<PropertyInfo, Func<T, object>>)GetValueGetter);
  57. }
  58. private static ValidationAttribute[] GetValidations(PropertyInfo property)
  59. {
  60. return (ValidationAttribute[])property.GetCustomAttributes(typeof(ValidationAttribute), true);
  61. }
  62. private static Func<T, object> GetValueGetter(PropertyInfo property)
  63. {
  64. return (T viewmodel) => property.GetValue(viewmodel, null);
  65. }
  66. }
  67. }