ReflectorExtensions.cs 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Reflection;
  4. using System.Text;
  5. using AspectCore.Extensions.Reflection;
  6. namespace Grpc.Extension.Common
  7. {
  8. /// <summary>
  9. /// ReflectorExtensions
  10. /// </summary>
  11. public static class ReflectorExtensions
  12. {
  13. /// <summary>
  14. /// 获取属性值
  15. /// </summary>
  16. /// <typeparam name="T"></typeparam>
  17. /// <param name="obj"></param>
  18. /// <param name="name"></param>
  19. /// <param name="bindingFlags"></param>
  20. /// <returns></returns>
  21. public static T GetPropertyValue<T>(this object obj, string name, BindingFlags bindingFlags) where T : class
  22. {
  23. var chProperty = obj.GetType().GetTypeInfo().GetProperty(name, bindingFlags);
  24. if (chProperty == null) throw new InvalidOperationException($"Cannot locate property {name}");
  25. var chReflector = chProperty.GetReflector();
  26. var value = chReflector.GetValue(obj) as T;
  27. return value;
  28. }
  29. /// <summary>
  30. /// 获取字段值
  31. /// </summary>
  32. /// <typeparam name="T"></typeparam>
  33. /// <param name="obj"></param>
  34. /// <param name="name"></param>
  35. /// <param name="bindingFlags"></param>
  36. /// <returns></returns>
  37. public static Tuple<T, FieldInfo> GetFieldValue<T>(this object obj, string name, BindingFlags bindingFlags) where T : class
  38. {
  39. var chField = obj.GetType().GetTypeInfo().GetField(name, bindingFlags);
  40. if (chField == null) throw new InvalidOperationException($"Cannot locate field {name}");
  41. var chReflector = chField.GetReflector();
  42. var value = chReflector.GetValue(obj) as T;
  43. return Tuple.Create(value, chField);
  44. }
  45. /// <summary>
  46. /// 获取字段值
  47. /// </summary>
  48. /// <typeparam name="T"></typeparam>
  49. /// <param name="type"></param>
  50. /// <param name="name"></param>
  51. /// <param name="bindingFlags"></param>
  52. /// <returns></returns>
  53. public static T GetFieldValue<T>(this Type type, string name, BindingFlags bindingFlags) where T : class
  54. {
  55. var chField = type.GetTypeInfo().GetField(name, bindingFlags);
  56. if (chField == null) throw new InvalidOperationException($"Cannot locate field {name}");
  57. var chReflector = chField.GetReflector();
  58. var value = chReflector.GetValue(null) as T;
  59. return value;
  60. }
  61. /// <summary>
  62. /// 获取方法
  63. /// </summary>
  64. /// <param name="type"></param>
  65. /// <param name="name"></param>
  66. /// <param name="bindingFlags"></param>
  67. /// <returns></returns>
  68. public static MethodInfo GetMethodInfo(this Type type, string name, BindingFlags bindingFlags)
  69. {
  70. var method = type.GetMethod(name, bindingFlags);
  71. if(method == null) throw new InvalidOperationException($"Cannot locate method {name}");
  72. return method;
  73. }
  74. }
  75. }