LinqHelp.Reflection.cs 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. using System;
  2. using System.Linq.Expressions;
  3. using System.Reflection;
  4. namespace Vit.Linq.QueryBuilder
  5. {
  6. public partial class LinqHelp
  7. {
  8. public static Func<T, object> GetFieldSelector_ByReflection<T>(Func<T, object> before, string fieldName)
  9. {
  10. return (T ori) =>
  11. {
  12. var midValue = before == null ? ori : before(ori);
  13. if (midValue == null) return null;
  14. var midType = midValue.GetType();
  15. //#1 property
  16. var property = midType.GetProperty(fieldName);
  17. if (property != null && property.CanRead)
  18. {
  19. return property.GetValue(midValue);
  20. }
  21. //#2 field
  22. var field = midType.GetField(fieldName, BindingFlags.Public | BindingFlags.Instance);
  23. if (field != null)
  24. {
  25. return field.GetValue(midValue);
  26. }
  27. //#3 null
  28. return null;
  29. };
  30. }
  31. public static Func<T, object> GetFieldSelector_ByReflection<T>(string fieldPath)
  32. {
  33. Func<T, object> getField = null;
  34. foreach (var fieldName in fieldPath?.Split('.'))
  35. {
  36. getField = GetFieldSelector_ByReflection(getField, fieldName);
  37. }
  38. return getField;
  39. }
  40. public static Expression<Func<T, object>> GetFieldExpression_ByReflection<T>(string fieldPath)
  41. {
  42. Func<T, object> getField = GetFieldSelector_ByReflection<T>(fieldPath);
  43. return t => getField(t);
  44. }
  45. }
  46. }