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