No Description
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

ExpressionUtils.cs 1.9KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. #if UNITY_EDITOR
  2. using System;
  3. using System.Linq.Expressions;
  4. using System.Reflection;
  5. namespace UnityEngine.InputSystem.Editor
  6. {
  7. internal static class ExpressionUtils
  8. {
  9. public static PropertyInfo GetProperty<TEntity, TProperty>(Expression<Func<TEntity, TProperty>> expression)
  10. {
  11. var member = GetMemberExpression(expression).Member;
  12. var property = member as PropertyInfo;
  13. if (property == null)
  14. throw new InvalidOperationException($"Member with Name '{member.Name}' is not a property.");
  15. return property;
  16. }
  17. private static MemberExpression GetMemberExpression<TEntity, TProperty>(Expression<Func<TEntity, TProperty>> expression)
  18. {
  19. MemberExpression memberExpression = null;
  20. switch (expression.Body.NodeType)
  21. {
  22. case ExpressionType.Convert:
  23. {
  24. var body = (UnaryExpression)expression.Body;
  25. memberExpression = body.Operand as MemberExpression;
  26. break;
  27. }
  28. case ExpressionType.MemberAccess:
  29. memberExpression = expression.Body as MemberExpression;
  30. break;
  31. }
  32. if (memberExpression == null)
  33. throw new ArgumentException("Not a member access", nameof(expression));
  34. return memberExpression;
  35. }
  36. public static Func<TEntity, TProperty> CreateGetter<TEntity, TProperty>(Expression<Func<TEntity, TProperty>> property)
  37. {
  38. var propertyInfo = GetProperty(property);
  39. var instance = Expression.Parameter(typeof(TEntity), "instance");
  40. var body = Expression.Call(instance, propertyInfo.GetGetMethod());
  41. var parameters = new[] { instance };
  42. return Expression.Lambda<Func<TEntity, TProperty>>(body, parameters).Compile();
  43. }
  44. }
  45. }
  46. #endif