【问题标题】:Expressions: Variable referenced from scope, but it is not defined exception表达式:从范围引用的变量,但未定义异常
【发布时间】:2012-12-03 19:56:08
【问题描述】:

我是 System.Linq.Expresions 的新手,我正试图找出这段代码有什么问题:

 var mc = new MyClass();

        ParameterExpression value = Expression.Parameter(typeof(object), "value");
        ParameterExpression xParam = Expression.Parameter(typeof(MyClass), "x");

        Expression<Func<MyClass, object>> e = x => x.Val;

        BlockExpression block = Expression.Block(new[] { xParam, value },
            Expression.Assign(e.Body, value));

        Expression.Lambda<Action<MyClass, object>>(block, xParam, value).Compile()(mc, 5); //I'm getting exception here when Compile()

...

class MyClass
    {
        public object Val
        {
            get;
            set;
        }
        public object OtherVal
        {
            get;
            set;
        }
    }

我只想构建类似 mc.Val = 5 的东西,假设 MyClass 和 object 参数是 lambda 的参数(我不想使用闭包)

【问题讨论】:

  • 当您发布完整的错误消息和堆栈跟踪时,人们通常会欣赏它

标签: .net linq lambda expression


【解决方案1】:

e.Body 引用来自e 的参数。但这是与xParam 不同的参数。两者同名是不够的。它们必须是同一个对象。

在理解中,您尝试使用 lambda 作为生成表达式的工具来获取表达式。要使这种方法起作用,您需要用您控制的参数 (xParam) 替换 e 中的所有参数。你必须保持一致。

【讨论】:

  • 换句话说,如果您创建一个 lambda 表达式,然后在该 lambda 表达式中使用传递的参数(即在块表达式或调用表达式中) - 您需要在构造不同的表达式时使用相同的 ParameterExpression 对象对象(LambdaExpression 和内部表达式)。
  • @nightcoder 是正确的。如果架构需要,您还可以重写现有的表达式树并根据自己的喜好替换参数表达式。
猜你喜欢
  • 2015-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多