MemberExpression:InvalidOperationExpression 变量“x”从范围“”引用,但未定义

2023-11-21

我在用着System.Linq.Expressions

我试图建立一个简单的Lambda表达式其中包括一个会员表达。如果我使用 System.Linq.Expressions API 显式创建 MemberExpression(例如建立会员访问权限),当我在 LambdaExpression 上调用 Compile() 时,我会收到错误“InvalidOperationExpression 变量 'x' 从作用域 '' 引用,但未定义”。

例如,这是我的代码

Expression<Func<Customer, string>> expression1, expression2, expression3;
Func<Customer, string> fn;
expression1 = (x) => x.Title;
fn = expression1.Compile();//works
fn(c);
MemberExpression m;
m = Expression.MakeMemberAccess(
Expression.Parameter(typeof(Customer), "x"), typeof(Customer).GetProperty("Title"));
expression2 = Expression.Lambda<Func<Customer, string>>(m,
    Expression.Parameter(typeof(Customer), "x"));

m = Expression.Property(Expression.Parameter(typeof(Customer),"x"), "Title");
expression3 = Expression.Lambda<Func<Customer, string>>(m,
    Expression.Parameter(typeof(Customer), "x"));

fn = expression3.Compile();//InvalidOperationExpression variable 'x' referenced from scope '', but it is not defined
fn = expression2.Compile();//InvalidOperationExpression variable 'x' referenced from scope '', but it is not defined

调用 Compile() 方法时,表达式 2 和表达式 3 会抛出异常,但表达式 1 不会;表达式1有效。为什么是这样?如何创建像表达式 2、3 中那样的 MemberExpression,并在调用 Compile() 时让它们工作(不抛出异常)?

Thanks


你正在创造不同的多次调用“x”的参数。如果您使用单个ParameterExpression,应该一切正常。

ParameterExpression p = Expression.Parameter(typeof(Customer), "x");
MemberExpression m = Expression.MakeMemberAccess(p, 
    typeof(Customer).GetProperty("Title"));
expression2 = Expression.Lambda<Func<Customer, string>>(m, p);

m = Expression.Property(p, "Title");
expression3 = Expression.Lambda<Func<Customer, string>>(m, p);

fn = expression3.Compile();
fn = expression2.Compile();

基本上,参数表达式与名称不匹配 - 您必须在各处使用相同的表达式。虽然有点痛,但是我们就这样吧……

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MemberExpression:InvalidOperationExpression 变量“x”从范围“”引用,但未定义 的相关文章

随机推荐

  • 如何使用算法来填充向量的向量

    I have typedef std vector
  • AngularJS $http:如何避免重定向跟随

    在 AngularJS 应用程序中 我对服务器 URL 进行 http post 调用 这个url的成功响应是30x重定向 我的问题是 http post严格遵循这个重定向并在成功回调中返回最终调用的结果 我想拦截此重定向并手动将用户重定向
  • 返回页面中所有 iframe 的 ID

    由于我正在使用的小部件格式 我有一个页面 其中嵌入了多个 iframe 我不会粘贴代码 因为它庞大且笨拙 但它本质上就是这样
  • Android Gradle 应用程序:connectedCheck 从依赖项运行测试

    我有一些有自己的测试的图书馆项目 我不负责这个库项目 也不关心它的测试 但是 当我运行时gradle app connectedCheck它运行我的测试 但它也运行依赖项的测试 有什么办法可以防止这种情况发生吗 我应该提到我的依赖项不在ap
  • decimal.InvalidOperation,除法对于非常大的数字来说是不可能的

    使用Python 3 5 2 gt gt gt from decimal import Decimal gt gt gt Decimal 12 Decimal 0 01 Decimal 0 00 gt gt gt Decimal 23456
  • Linq 相当于 SQL LEFT 函数?

    我们有一个数据库 其中一些字段为 varchar max 可能包含大量文本 但是我遇到的情况是 我只想从字段中选择前 300 个字符 以用于 MVC 网站上的分页结果表进行该领域的 预览 对于一个简化的示例查询 我想在表中显示所有位置 这将
  • 按连续序列对整数进行分组列表

    我有一个整数列表 1 2 3 4 5 8 9 10 11 200 201 202 我想将它们分组到一个列表列表中 其中每个子列表都包含顺序未被破坏的整数 像这样 1 5 8 11 200 202 我有一个相当笨拙的工作 lSequenceO
  • 在淘汰赛中重新应用绑定

    我基本上想在同一页面上为不同的对象重新应用绑定 但有奇怪的行为 重新应用绑定后 项目列表丢失 请看这里 http jsfiddle net baio 9UcUs 5 该怎么办 简短的回答是不支持 长的答案是有一些方法可以解决这个问题 一种方
  • 使用反射解压数组

    我正在尝试解压从反映对象字段获得的数组 我将常规字段的值设置为一个对象 如果它是一个数组 那么我想将我的通用对象转换为数组 无论其类型是什么 并提取其内容 fields i setAccessible true String key fie
  • 如何直接从IDE读取Python源代码

    我目前正在学习Python 我想通过阅读它的源代码来更深入地了解Python是如何工作的 我可以手动进入Python安装目录查看源代码 我想知道是否可以直接从PyCharm等IDE读取Python源代码 我尝试过了control click
  • 如果没有互联网连接,xmlns属性如何工作并被浏览器理解?

    一个简单的 XHTML 文档 具有最少的所需标签 以及xmlns属性有一个 http 链接 如果我在 localhost 上工作并且没有 Internet 连接 我不能在 XHTML 上工作吗 The content of the docu
  • 导入语句错误“需要“FILENAME”或

    我在将 Appirater 集成到我的应用程序中时遇到一些问题 我已经正确添加了所有必要的文件 并且拥有正确的代码 我认为 但是在尝试将其实现到我的 AppDelegate m 文件中时出现错误 当我做 import Appirater h
  • 使用 MockMvc 在 Spring MVC 中进行单元测试/登录

    我有一个使用 Spring MVC 创建的非常简单的 REST 应用程序 代码可在GitHub 它有一个简单的WebSecurityConfigurer如下 Override protected void configure HttpSec
  • 是否可以使用android的语音识别而不显示对话框?

    我想在 android 中使用语音发送文本 api 但我不想被这些对话框拖慢速度 没有它们是否可以使用该功能 对的 这是可能的 您可以使用 API 中的 SpeechRecognizer 类 确保它在主线程中使用 根据 API 的要求 并且
  • 将 MSTest、xUnit 或 NUnit 与 dotnet core 结合使用

    TLDR 跳转到答案以获取有关工作 xUnit 或 MSTest 设置的详细信息 xUnit 是最不痛苦的选择 我无法让 NUnit 在我的构建服务器上工作 因此我尝试了 xUnit 和 MSTest 两者都对我不起作用 MSTest 我只
  • 错误边界禁用交换机内部的路由

    For 很长时间在遇到错误边界后 我一直试图让路由在我们的应用程序中工作 但直到今天我才发现看似与周围许多示例相同的代码有一个重要的区别 路由被包裹在Switch 如果启用的话 这个简单的更改足以阻止路由工作 Demo 采取以下片段 如果我
  • 是否可以从 npm 中下载的 .zip 文件从 git 存储库安装包?

    我已经通过手动下载了存储库的主分支Download ZIPGitHub 上的按钮 现在 我的问题是 是否可以从下载的 git 存储库安装包 npm 中的 zip 文件 Running npm install Pobrane lwip mas
  • 通过子网掩码计算IP范围

    如果我有一个子网掩码 例如255 255 255 0和一个IP地址192 168 1 5 有没有一种简单的方法可以确定该子网内所有可能的IP地址 在这种情况下 192 168 1 1 192 168 1 2 192 168 1 3 192
  • 关于使用 Python xarray 将经度数组从 0 - 360 更改为 -180 到 180

    我是一名 matlab 用户 最近尝试更多地使用 Python 进行计算 我正在使用 xarray 并希望将地球物理场的经度数组从 0 360 更改为 180 到 180 但是当我这样做时 df xr open dataset ecmwf
  • MemberExpression:InvalidOperationExpression 变量“x”从范围“”引用,但未定义

    我在用着System Linq Expressions 我试图建立一个简单的Lambda表达式其中包括一个会员表达 如果我使用 System Linq Expressions API 显式创建 MemberExpression 例如建立会员