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