- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在使用 System.Linq.Expressions
我试图构建一个简单的 LambdaExpression其中包括 MemberExpression .如果我使用 System.Linq.Expressions API(例如 MakeMemberAccess)显式创建 MemberExpression,我将在调用 Compile() 时收到错误“InvalidOperationExpression variable 'x' referenced from scope '', but it is not defined”在 LambdaExpression 上。
例如,这是我的代码
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
expression2 和 expression3 在调用 Compile() 方法时会抛出异常,而 expression1 不会;表达式 1 有效。为什么是这样?我如何创建一个像表达式 2、3 中的 MemberExpression 并在我调用 Compile() 时让它们工作(不抛出异常)?
谢谢
最佳答案
您多次创建名为“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();
基本上参数表达式与名称不匹配 - 你必须在所有地方使用相同的表达式。有点痛,但我们开始了......
关于c# - MemberExpression : InvalidOperationExpression variable 'x' referenced from scope '' , 但未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6106283/
我知道如何创建一个 MemberExpression 例如entity.Property // Expression: "entity" var parameter = Expression.Para
我正在尝试使用 Expression.MakeBinary 动态生成二进制表达式: public static BinaryExpression MakeBinary( ExpressionT
假设我有以下代码(我需要在更复杂的表达式中的任何位置包含此代码段)。 Type paraType = typeof(MyModel); var member = paraType.GetMember(
我有这个(在 C# MVC 项目中): public class Bindable { //(...) public IHtmlString FormControlTextField(
这里有人有编写自定义 Linq 提供程序的经验吗? 我想做的是判断作为业务对象属性的 MemberExpression 是否应该包含在 SQL 中,或者作为常量处理,因为它来自恰好是业务对象的局部变量
我们有以下实体: public class Employee { public int Serial { get; set; } public string FullName { ge
我正在尝试编写一个通用函数,它接受一个 MemberExpression 和一个对象,并返回成员表达式中定义的属性的值。 这是获取属性名称的代码示例。 public static TProperty
我正在为 MVC 创建一个表单生成器,我想通过以下方式模拟 Razor 对链式属性的处理: builder.TextBoxFor(x => x.User.Email); 这将以与 Razor 相同的方
想象一下以下类: class A { public string Test {get; set;} } class B : A { .. some other members .. }
我们正在努力使在我们系统的所有区域编写强类型代码变得容易,而不是设置 var sortColumn = "FirstName"我们想说sortOption = (p => p.FirstName) .
我需要帮助。我有两个类:实体和模型。他们的代码如下。 public class TestEntityForSerialize { public String FIO { get; set; }
我问类似的问题here,假设这种类型: public class Product { public string Name { get; set; } public string Title { g
给定这段代码: static void Main(string[] args) { Expression> test = i => i.Prop; var body = (UnaryE
所以,假设我在 C# 中有以下表达式: Expression> expr = () => foo.Bar; 如何提取对 foo 的引用? 最佳答案 I had the same problem, bu
描述 我有一个表达式指向我的类型的属性。但它不适用于所有属性类型。 "不是意思"是什么意思它导致不同的表达类型。我以为它会导致MemberExpression 但事实并非如此。 对于 int 和 Gu
根据我的 Select a model property using a lambda and not a string property name 的答案采取行动问题,想要向集合添加属性,如下所示:
我希望使用表达式树创建以下 Linq 表达式: var result2 = soldiers.OrderByDescending(soldier => soldier.Ranks.OrderBy(r=
我正在处理一个 linq 查询,并尝试按照 Mutilevel include in C# Linq 中的建议将实体包含到多个级别. 所以我写下这样的查询 query.Include(u => u.
以下成员表达式类型有时可以为 Nullable,我正在检查,但是我需要将其转换为不可为 null 的类型, MemberExpression member = Expression.Property(
下面的表达式将属性 NAME 与值 PETER 进行比较。 ParameterExpression pe = Expression.Parameter(typeof(T), "
我是一名优秀的程序员,十分优秀!