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