ReflectionUtils.cs 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq.Expressions;
  4. using System.Reflection;
  5. using System.Text;
  6. namespace VLB
  7. {
  8. public static class ReflectionUtils
  9. {
  10. public static string GetFieldPath<T, TValue>(Expression<Func<T, TValue>> expr)
  11. {
  12. MemberExpression me;
  13. switch (expr.Body.NodeType)
  14. {
  15. case ExpressionType.Convert:
  16. case ExpressionType.ConvertChecked:
  17. var ue = expr.Body as UnaryExpression;
  18. me = (ue != null ? ue.Operand : null) as MemberExpression;
  19. break;
  20. default:
  21. me = expr.Body as MemberExpression;
  22. break;
  23. }
  24. var members = new List<string>();
  25. while (me != null)
  26. {
  27. members.Add(me.Member.Name);
  28. me = me.Expression as MemberExpression;
  29. }
  30. var sb = new StringBuilder();
  31. for (int i = members.Count - 1; i >= 0; i--)
  32. {
  33. sb.Append(members[i]);
  34. if (i > 0) sb.Append('.');
  35. }
  36. return sb.ToString();
  37. }
  38. }
  39. }