zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    ds
    使用js做的贪吃蛇游戏的知识总结
    使用js实现的关联表单
    使用jquery实现的计算器功能
    vue学习(2)关于过渡状态
    vue学习(1)生命周期
    vue学习(0)写在前面的一句话
    bootstrap(7)关于进度条,列表,面板
    bootstrap(6)分页,翻页,徽章效果
    异常捕获
  • 原文地址:https://www.cnblogs.com/chucklu/p/11573832.html
Copyright © 2011-2022 走看看