Tag: 表达式树

动态构建表达式树

我正在关注这个优秀的例子: 将Linq转换为Sql表达式到表达式树 在我的情况下,我正在尝试构建一个表达式树,其中要过滤的类型仅在运行时已知,并表示为字符串。 在上面的示例中,类型Region已知并直接键入: ParameterExpression pe = Expression.Parameter(typeof(Region), “region”); 在我的应用程序中,我已经能够将其重写为: ParameterExpression pe = Expression.Parameter(Type.GetType(“mystring”), “listData”); 我的绊脚石就是这个例子: MethodCallExpression whereCallExpression = Expression.Call( typeof(Queryable), “Where”, new Type[] { query.ElementType }, query.Expression, Expression.Lambda<Func>(e3, new ParameterExpression[] { pe })); var results = query.Provider.CreateQuery(whereCallExpression); 在这两行中, Region是直接键入的。 有没有办法动态使用字符串“Region”来实现同样的事情?

构建Linq通用查询

我有一个包含两个表的数据库: public class A { public string Name { get; set; } public int Id { get; set; } } public class B { public int Id { get; set; } public bool Prop1 { get; set; } public bool Prop2 { get; set; } public bool Prop3 { get; set; } public bool Prop4 […]

如何创建一个表达式,该表达式抛出exception或根据条件返回值?

我正在努力构建一个表达式,如果条件为true则抛出一个exception,如果它是false,它应该返回一个值,但我总是得到ArgumentException : var expr = Expression.Condition( Expression.Equal(Expression.Constant(0), Expression.Constant(0)), Expression.Throw(Expression.Constant(new DivideByZeroException())), Expression.Constant(1)); var lambda = Expression.Lambda<Func>(expr); var result = lambda.Compile()(); 如果我将Expression.Empty()作为Condition的第三个参数然后运行,但如果条件为false,则不会得到所需的结果。

具有字符串赋值和获取值的表达式树

我已经构建了自己的SQL查询构建器,它拆分了一个Expression,但是,我在尝试获取与lambda表达式相同的函数中定义的字符串值时遇到了问题。 这是我在控制台应用程序中尝试做的事情: private static void MyBuilderTest() { var sqlBuilder = new SqlBuilder(); // Doesn’t work — NEED GUIDANCE HERE var testValue = “Test”; // Defined in the same function as the lambda below sqlBuilder.Select(o => o.FooValue == testValue); // Works var someObject = new SomeObject { SomeValue = “classTest }; sqlBuilder.Select(o => o.FooValue == someObject.SomeValue); […]

创建使用动态生成类型的表达式树

我有一个完全初始化的MethodBuilder和EnumBuilder 。 MethodBuilder指向动态程序集的入口点。 它有以下签名: public static int Main (string [] args) {…} 程序集生成代码工作正常,我可以使用Reflection.Emit来测试它。 我想要从表达式树中保存目标代码,而不是发出IL。 这应该: 声明一个枚举变量 为它赋值 写入控制台 读取暂停控制台 将枚举值作为Int32返回 表达树: // Intention: Declare string [] args in the expression scope. var arguments = Expression.Parameter(typeof(string []), “args”); // Intention: var code = default(MyDynamicEnum); var code = Expression.Variable(builderEnum, “code”); // Intention: code = MyDynamicEnum.Two; var assign […]

在c#中创建表达式树

我试图在LINQ中使用表达式树创建一个动态查询来表示以下查询 WageConstIns.Where(WageConstIn => WageConstIn.Serialno.ToString().StartsWith(“2800”)); 我试图像这样创建它: MemberExpression le1 = LinqExpression.Property(paramExp, “Serialno”); MethodCallExpression le2 = LinqExpression.Call(le1, typeof(string).GetMethod(“ToString”, System.Type.EmptyTypes)); ConstantExpression le3 = LinqExpression.Constant(“2800”); MethodCallExpression le4 = LinqExpression.Call(le2, typeof(string).GetMethod(“StartsWith”)); 我在运行时遇到错误。 如何使用表达式树最好地构建上述查询?

在表达式树中检查了类型转换?

我正在使用Expression来创建一些动态生成的代码。 我的解决方案有效,除了一个function:我想做一个检查类型转换,如果转换失败,则抛出TypeCastException。 我找到了Expression.TypeAs(),它执行类型转换,但是当转换失败时它返回null而不是throw。 是否有一种简单的方法可以在Expression中执行检查类型转换? 或者我是否必须检查null并自己抛出exception? 这就是我所拥有的: – ParameterExpression typedAttribute = Expression.Variable(attributeType, “typedAttribute”); ParameterExpression typedValue = Expression.Variable(valueType, “typedValue”); BlockExpression methodBlock = Expression.Block(new[] { typedAttribute, typedValue }, new Expression[] { Expression.Assign(typedAttribute, Expression.TypeAs(attribute, attributeType)), Expression.Assign(typedValue, Expression.TypeAs(value, valueType)), Expression.Call(visitor, methodInfo, typedAttribute, typedValue), Expression.Assign(visited, Expression.Constant(true)), });

“没有为类型’System.String’和’System.String’定义二元运算符Add。” – 真的吗?

尝试运行以下代码时: Expression<Func> stringExpression = Expression.Lambda<Func>( Expression.Add( stringParam, Expression.Constant(“A”) ), new List() { stringParam } ); string AB = stringExpression.Compile()(“B”); 我得到标题中引用的错误:“没有为类型’System.String’和’System.String’定义二进制运算符Add。” 那是真的吗? 显然在C#中它起作用。 表达式编译器无法访问C#特殊语法糖中的string s = “A” + “B”吗?

是否可以使用ParameterExpression?

我想用out参数定义Lambda表达式。 有可能吗? 以下是我尝试过的C#.Net 4.0控制台应用程序的代码片段。 正如您在Procedure25中看到的,我可以使用lambda表达式来定义具有输出参数的委托,但是,当我想使用linq表达式执行相同操作时,过程24中的代码将失败: System.ArgumentException未处理Message = ParameterExpression类型’System.Boolean’不能用于’System.Boolean&’Source = System.Core类型的委托参数 我知道我可以使用带有bool成员的输入类对象并将值传递给调用者,但我很好奇我是否可以以某种方式定义参数。 谢谢 static void Main(string[] args) { Procedure25(); Procedure24(); Console.WriteLine(“Done!”); Console.ReadKey(); } private delegate int Evaluate(string value, out bool usesVars); private static void Procedure24() { // This fails to compile: //Expression x = (string val, out bool usesSimVals) => //{ // usesSimVals = true; // […]

我可以使用System.Linq.Expressions动态生成异步方法吗?

我知道编译器无法将异步lambda表达式转换为表达式树,但是可以手动生成表达式树吗? var expr = Expression.Lambda<Func>( // how do I use ‘await’ in the body here? ); var func = expr.Compile(); 我在Expression类中找不到与async或await相关的任何方法,但也许还有另一种方法?