• Access the value of a member expression


    Access the value of a member expression

    解答1

    You can compile and invoke a lambda expression whose body is the member access:

    private object GetValue(MemberExpression member)
    {
        var objectMember = Expression.Convert(member, typeof(object));
    
        var getterLambda = Expression.Lambda<Func<object>>(objectMember);
    
        var getter = getterLambda.Compile();
    
        return getter();
    }

    Local evaluation is a common technique when parsing expression trees. LINQ to SQL does this exact thing in quite a few places.

     解答2

    MemberExpression right = (MemberExpression)((BinaryExpression)p.Body).Right;
     Expression.Lambda(right).Compile().DynamicInvoke();

     会有同样的问题

    尝试gist

    https://gist.github.com/jcansdale/3d4b860188723ea346621b1c51fd8461#file-expressionutilities-cs-L13

    UKERecognition.Infrastructure.Exceptions.UIException: UserInterface ---> System.Exception: Couldn't evaluate Expression without compiling: l

    尝试Lambda表达式公共操作类(二)

      private static object GetMemberValue(MemberExpression expression)
            {
                if (expression == null)
                    return null;
                var field = expression.Member as FieldInfo;
                if (field != null)
                {
                    var constValue = GetConstantValue(expression.Expression);
                    return field.GetValue(constValue);
                }
                var property = expression.Member as PropertyInfo;
                if (property == null)
                    return null;
                var value = GetMemberValue(expression.Expression as MemberExpression);
                return property.GetValue(value);
            }
    
            private static object GetConstantValue(Expression expression)
            {
                var constantExpression = expression as ConstantExpression;
                if (constantExpression == null)
                    return null;
                return constantExpression.Value;
            }

    System.Reflection.TargetException: Non-static method requires a target.
    at System.Reflection.RuntimeMethodInfo.CheckConsistency(Object target)
    at System.Reflection.RuntimeMethodInfo.InvokeArgumentsCheck(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
    at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
    at System.Reflection.RuntimePropertyInfo.GetValue(Object obj, Object[] index)
    at LISA.Custom.Infrastructure.LisaExpressionVisitor`1.GetMemberValue(MemberExpression expression) in

  • 相关阅读:
    洛谷 1443——马的遍历(广度优先搜索)
    jzoj C组 2017.1.21
    jzoj C组 2017.1.20 比赛
    jzoj C组 2017.1.19 比赛
    jzoj C组 2017.1.18 比赛
    jzoj C组 2017.1.17 比赛
    jzoj C组 2017.1.16 比赛
    jzoj C组 2017.1.15比赛
    [LCA][数学]JZOJ 4794 富爷说是一棵树
    [CDQ分治][带权并查集]JZOJ 4769
  • 原文地址:https://www.cnblogs.com/chucklu/p/11573832.html
Copyright © 2020-2023  润新知