ReflectorExtensions.cs 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. using AspectCore.Extensions.Reflection;
  2. using Microsoft.AspNetCore.Hosting;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.IO;
  6. using System.Linq;
  7. using System.Reflection;
  8. using System.Reflection.Metadata;
  9. using TEAMModelOS.SDK.Context.Attributes.Azure;
  10. namespace TEAMModelOS.SDK.Helper.Common.ReflectorExtensions
  11. {
  12. public static class ReflectorExtensions
  13. {
  14. public static T GetPropertyValue<T>(this object obj, string name, BindingFlags bindingFlags) where T : class
  15. {
  16. var chProperty = obj.GetType().GetTypeInfo().GetProperty(name, bindingFlags);
  17. var chReflector = chProperty.GetReflector();
  18. var value = chReflector.GetValue(obj) as T;
  19. return value;
  20. }
  21. public static Tuple<T, FieldInfo> GetFieldValue<T>(this object obj, string name, BindingFlags bindingFlags) where T : class
  22. {
  23. var chField = obj.GetType().GetTypeInfo().GetField(name, bindingFlags);
  24. var chReflector = chField.GetReflector();
  25. var value = chReflector.GetValue(obj) as T;
  26. return Tuple.Create(value, chField);
  27. }
  28. public static T GetFieldValue<T>(this Type type, string name, BindingFlags bindingFlags) where T : class
  29. {
  30. var chField = type.GetTypeInfo().GetField(name, bindingFlags);
  31. var chReflector = chField.GetReflector();
  32. var value = chReflector.GetValue(null) as T;
  33. return value;
  34. }
  35. /// <summary>
  36. /// 获取T类型属性标记的类集合
  37. /// </summary>
  38. /// <typeparam name="T"></typeparam>
  39. /// <returns></returns>
  40. public static List<Type> GetAllTypeAsAttribute<T>(string[] ScanModel)
  41. {
  42. Type attr = typeof(T);
  43. string currentDirectory = Path.GetDirectoryName(attr.Assembly.Location);
  44. List<Type> types = new List<Type>();
  45. if (ScanModel != null)
  46. {
  47. foreach (var model in ScanModel)
  48. {
  49. Assembly assembly = Assembly.LoadFrom(currentDirectory + "\\" + model + ".dll");
  50. // Assembly assembly = Assembly.GetCallingAssembly();
  51. var TypeInModel = from t in assembly.GetTypes()
  52. let attributes = t.GetCustomAttributes(attr, true)
  53. where attributes != null && attributes.Length > 0
  54. select t;
  55. types.AddRange(TypeInModel);
  56. }
  57. }
  58. return types;
  59. }
  60. }
  61. }