c# 关于构建表达式树的问题

Expression> ex = (ins, param) => ((Program)ins).Call(param[0], param[1], param[2]);

有以上表达式,如何构建该表达式树?
通过Expression Tree Visualizer看到表达式结构是这样的图片说明但不知道如何构建表达式树,希望高手能指导一下,我自己构建了一段:ParameterExpression px = Expression.Parameter(typeof(object[]), "argus");

        ConstantExpression index1 = Expression.Constant(0);
        ConstantExpression index2 = Expression.Constant(1);
        ConstantExpression index3 = Expression.Constant(1);

        BinaryExpression pm1 = Expression.ArrayIndex(px, index1);
        BinaryExpression pm2 = Expression.ArrayIndex(px, index2);
        BinaryExpression pm3 = Expression.ArrayIndex(px, index3);

后面构建主体的时候就不太清楚了,谢谢赐教

2个回答

using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Program
    {
        public void Call(object a, object b, object c)
        {
            Console.WriteLine(a);
            Console.WriteLine(b);
            Console.WriteLine(c);
        }
        static void Main(string[] args)
        {
            //Expression<Action<object, object[]>> ex = (ins, param) => ((Program)ins).Call(param[0], param[1], param[2]);
            ParameterExpression ins = Expression.Parameter(typeof(object), "ins");
            ParameterExpression param = Expression.Parameter(typeof(object[]), "param");
            ConstantExpression index1 = Expression.Constant(0);
            ConstantExpression index2 = Expression.Constant(1);
            ConstantExpression index3 = Expression.Constant(2);
            BinaryExpression pm1 = Expression.ArrayIndex(param, index1);
            BinaryExpression pm2 = Expression.ArrayIndex(param, index2);
            BinaryExpression pm3 = Expression.ArrayIndex(param, index3);
            UnaryExpression p = Expression.TypeAs(ins, typeof(Program));
            MethodCallExpression call = Expression.Call(p, typeof(Program).GetMethod("Call"), pm1, pm2, pm3);
            Expression<Action<object, object[]>> ex = Expression.Lambda<Action<object, object[]>>(call, ins, param);
            ex.Compile()(new Program(), new object[] { 1, 2, 3 });
        }
    }
}

非常非常感谢您的回答

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
构建表达式树
方法输入后缀表达式,如果输入的是中缀表达式,则利用栈,转换成后缀表达式,然后检测每一个输入字符,如果操作数,则把该数的地址压入栈中,如果是操作符,则把栈的栈顶元素和栈顶元素的下一个元素出栈,分别为操作符的左子树和右子树,然后把该操作符的地址压入栈中,最后中序递归输出 #include #include #include using namespace std; typedef struct
波兰表达式 构建 表达式树
    这里提供一种将波兰表达式构建成表达式树的一种方法。        二叉树的节点有三个成员:数值(或者操作符)type,左节点lnode(被操作数),右节点rnode(操作数)         //借助栈将波兰表达式 构建 表达式树   public static treeNode makeupPloenTree(String postorderExpression)   {   Stri...
动态构建Expression表达式树
动态构建Expression表达式树 话说.Net已经发展到4.5了,大家对Lambda和Linq应该比较熟悉了。比如我们要取出产品集合里面SKU以&quot;123&quot;开头的产品集,就可以这么写:Products=Products.Where(p=&amp;gt;p.SKUCode.StartWith(&quot;123&quot;));   现下有这么个需求,用户输入以逗号分隔的字符串,求取SKU以分隔的字符串开头的产品集,...
C#表达式树
C#表达式树 表达式和表达式树 表达式可以是一个参数(如参数x),一个常数(如常数5),一个加运算(如x+5)等等,可以把几个小的表达式组装在一起成为大的表达式,例如:(x+5)-(++y)。对于这样一个表达式可以用一棵树来表示,如下: 这就是表达式树,表达式树本身也是一个表达式(大的表达式)。一个表达式也是一棵表达式树,可以说它是一棵小的表达式树。可以把表达式树和表达式认为是一...
二叉树应用——后缀表达式构建表达式树
针对前一篇博文后缀表达式求值、中缀表达式到后缀表达式的转换,已经可以实现中缀表达式到后缀表达式的转换,这里再介绍根据后缀表达式构建表达式树,那我们就能够从这两种常用类型的输入表达式(中缀和后缀)生成表达式树。
关于表达式树
如何动态生成如下linq的表达式树rnrnlist.Select(p=>newID=p.ID,Name = p.Name)rnrn或者是说如何动态创建匿名类的表达式也可以。。rnrn请高手帮忙啊!!
C#学习日记 表达式树
using System; using System.Linq.Expressions; using System.Linq; using System.Collections.Generic; namespace Sample { public class MainEntryPoint { static int Main(string[] args) { Expression
关于表达式树的类型转换的一点问题
现有两个类rn class MyDatarn rn public int v1 get;set;rn public int v2 get; set; rn rn class YouDatarn rn public int v1 get; set; rn public int v2 get; set; rn rn定义一个lambda表达式树rnExpression> exp = m=>m.v1 + m.v2 + m.v1 * 5 - m.v2 *3;rn有什么方法能让下面的表达式树满足:rnExpression> exp2rnrnexp2和exp只是参数不一样。rnrn好像是可以用ExpressionVisitor来把exp的类型改为YouData,具体如何实现,请高手指点。
C# 表达式树的用法
最近学习C#表达式树,就是想不明白该怎么用,做什么用,哪个大侠有实际应用的例子,帮忙开开窍
C#表达式树教程
C# 表达式树教程,阐释表达式树的原理,结合lambda表达式讲解
c#——ExpessionTree(表达式树)
表达式树是.NET 3.5之后引入的,它是一个强大灵活的工具(比如用在LINQ中构造动态查询)。  表达式树的语法如下: Expression> = (param) => lamdaexpresion;  吃个栗子: Expressionint, int, int>> expr = (x, y) => x+y; 这就是一个表达式树了。使用Expressio
C#中的表达式树的浅解
表达式树可以说是Linq的核心之一,为什么是Linq的核心之一呢?因为表达式树使得c#不再是仅仅能编译成IL,我们可以通过c#生成一个表达式树,将结果作为一个中间格式,在将其转换成目标平台上的本机语言。比如SQL。我们常用的Linq to sql就是这样生成SQL的。 表达式树是.NET 3.5之后引入的,它是一个强大灵活的工具(比如用在LINQ中构造动态查询)。 先来看看Expres
表达式树
表达式树 表达式树是用来解决表达式的一种常用的工具,它将表达式建立成一个二叉树,而二叉树的中序遍历顺序刚好是表达式的运算顺序。 [题目] 输入一个字符表达式,每个字符代表一个数字,输出运算结果。 [代码] 以下代码参考了刘汝佳《算法竞赛入门经典》。 //表达式树声明 struct exprtree { char op; exprtree *left; exprtree *right; }; ...
表达树—构建表达式树、获取表达式(二)
表达树—构建表达式树、获取表达式(二) 回顾二叉树的递归遍历   前序遍历:访问根结点--&amp;gt;前序遍历根结点的左子树--&amp;gt;前序遍历根结点的右子树。   中序遍历:中序遍历根结点的左子树--&amp;gt;访问根结点--&amp;gt;中序遍历根结点的右子树。   后序遍历:后序遍历根结点的左子树--&amp;gt;后序遍历根结点的右子树--&amp;gt;访问...
二叉树(C语言)以及构建表达式树
二叉树的C语言实现 构建表达式树,分别前序遍历、中序遍历、后序遍历表达式树 同事在main文件中,有测试代码。
关于表达式树的疑问
本菜鸟在啃表达式树,想到一个以前遇到的问题,就是根据所给的字段,对集合进行动态排序。rnrn现在我想用表达式树来解决这个问题,遇到一点小问题,希望各位大神不吝赐教。rn[code=csharp]rn ParameterExpression parameterExpression = Expression.Parameter(typeof(T), "a");rn MemberExpression memberExpression = Expression.PropertyOrField(parameterExpression, orderField); rn Expression> expression = Expression.Lambda>(memberExpression, parameterExpression);rn Func func = expression.Compile();rn if (orderFunc == "asc")rn rn return list.OrderBy(func);rn rn elsern rn return list.OrderByDescending(func);rn rn[/code]rn这是我写的代码,可以看到rn[quote]Expression>[/quote]这里的Func第二个参数我写成了int,这样我如果根据int型的字段去排序是没有问题,但是如果我想根据DateTime类型的字段去排序就不行了,需要把int改成DateTime。rn我天真的以为只要这么写就可以了:rn[code=csharp] Expression>[/code],可惜不行,会报一个异常出来:类型为“System.DateTime”的表达式不能用于返回类型“System.Object”。rnrnrn有什么办法可以优雅(我可以想到的办法就是 用反射获得这个字段是什么类型的,然后 根据不同的类型 去创建不同 的Expression,rn这样就需要写一堆 case,但是这样有点傻 )的解决这个问题呢?rnrn
Uva12219 递归打印树和构建表达式树
#include #include #include #include using namespace std; struct T{     string s;     int ls,rs;     bool operator     {         if(s!=rhs.s) return s         else if(ls!=rhs.ls) return ls
C#高级编程六十五天----表达式树
表达式树 以前没听过表达式树,只听过表达式,而且听过Lambda表达式,首先介绍一下.NET里表达式树的核心概念:讲代码作为数据,他将一些代码表示为一个对象树,树中的每个节点本身都是一个表达式,不同的表达式类型代表能在代码中执行不同操作:二元操作,一元操作,方法调用等等.   System.Linq.Expression命名空间包含了代表表达式的各个类.所有的表达式类都从Expression
C#高级编程六十六天----表达式树总结
表达式树总结 基础 表达式树提供了一个将可执行代码转换成数据的方法.如果你要在执行代码之前修改或转换此代码,那么它是很有用的.有其是当你要将C#代码----如LINQ查询表达式转换成其他代码在另一个程序----如SQL数据库里操作它. 表达式树的语法: 考虑下面简单的Lambda表达式: Funcfunction=(a,b)=>a+b; 这个语法包含三个部分: 1.一个声明 : Fu
C# 规约模式与表达式树(Specification And Express-Tree)
在EF(Entity Framework)中引入了查询规约 它是配合“仓储模式”查询使用的 实际上仓储模式是用于优化数据库压力的 在很多的时候由于开发人员的问题它所带来的益处比较微妙 那么为什么需要使用规约模式 它主要是用于把复杂查询的问题进行切割细化 随意的组合其查询部分 比如传统的SQL语句 则是一种典型的规约的书面形式 规约故名思意是一种约束性质的东西 但显然规约更多是与查询相关 我时常
表达式树使用(二)【修改表达式树】
Just because someone stumbles loses their way,it doesn’t mean they’re lost forever.Sometimes we all need a little help. 人偶尔一次失足迷失了方向不等于永远会迷失下去。有时候我们只需要有人搭把手。Program.cs class Program { stat
c#——表达式树在LINQ动态查询
一般如果逻辑比较简单,只是存在有的情况多一个查询条件,有的情况不需要添加该查询条件 简单方式这样操作就可以了 public IQueryable DynamicChainedSyntax (IQueryable files, bool pastOnly) { var query = files.Where(file => file.ImportDate > DateTime.No
请教个表达式树的问题
[code=C#]rn Func lambda = (a, b) => a + b * 2;rnrn Expression> expression = (a, b) => a + b * 2;rn[/code]rnrn这两句有什么区别,我知道编译成IL后不一样,但是我不懂IL。哪位能通俗地解释一下呢?rn什么时候用第一句的Func,什么时候用Expression
Linq表达式树问题
大家好。自己写了一个方法rnrnpublic IQueryable Get(Expression> expression)rnrn rnrn调用rnrnGet( u => u.name == "test");rnrn rnrn现在我有好几个条件,如 username,date,type。。并且当条件为空时不作为查询条件rnrn这个时候应该如何拼接这个Expression, 如何调用Get(expression);rnrn
初学表达式树,有些问题
1。expression> =(a,b)=>a/b;rn2。expression> =(a,b)=>a*b;rn3。expression> =(a,b,c)=>(a/b)*c;rn1,2怎么套起来变成3rn
Expression表达式树缓存 Expression表达式树序列化
Expression表达式树缓存 Expression表达式树序列化
中缀表达式树以及利用中缀表达式树求值
将简单的中缀表达式转换成表达式树,然后利用表达式树对中缀表达式进行求值。
数据结构-表达式树
《数据结构与算法》学到树那章,看到有表达树这样东西,于是实现了一下,但是目前暂时不支持括号 实现那里借用了之前将中缀表达式转换为后缀表达式的代码,输入中缀表达式,然后后缀表达式和中缀表达式(中缀转后缀再转中缀。。。) #include #include #include using namespace std; struct Node { int num;/
lambda表达式与表达式树
lambda表达式与表达式树
表达式树的简析
二叉树是表达式处理的常用工具。找到"最后计算"的运算符(它是整棵表达式树的根),然后递归处理。 递归处理成树是表达式处理的一个重要方式。这里我只记录和理解了lrjlrjlrj老师的代码(抄了一遍,自己还没动手自己写过。不过目前这不是重点内容,所以到此为止。 个位数加减乘除成表达式树 const int maxn = 1000; int lch[maxn],rch[maxn];char op[max...
表达式树的值
问题 L: 表达式树的值 时间限制: 1 Sec 内存限制: 128 MB 提交: 351 解决: 228 [提交][状态][讨论版] 题目描述 读入表达式树的先序遍历字符串,求其值。运算符只可能是加减乘除,保证输入的每个子表达式树的结果都是整数值且可以用C语言的int类型表达。输入 输入由多组测试数据组成。每组数据包含一行字符串,即表达式树的先序遍历序列,字符串长度大于0且不超过1
表达式树的应用
动态创建表达式树、执行表达式树及表达式树的调试,使读者能熟练认识表达式树在动态查询上带来的便利。
二叉表达式树
C++语言实现的二叉表达式树,包含建树的详细过程
计算表达式树
很简单,采用递归的方式来计算表达式树(二叉树)。什么是表达式树,请看例子:下面给出从根节点开始,计算表达式树的值得算法://计算表达式树 public static double caculatePloenTree(treeNode root) { if(!(root.type.equals(&quot;+&quot;) || root.type.equals(&quot;-&quot;)||root.type.eq...
Lambda表达式树
Lambda表达式树的基本使用
后缀表达式树
水平有限,代码粗糙。。。。。。。 构造表达式树后用中序遍历输出结果。 #include #include #include #include #include using namespace std; const int MAX =100; struct node {     char data;     struct node *l;    
生成表达式树
栈及中缀表达式转后缀表达式的实现看之前的日志     //&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;mocro.h #ifndef _MACRO_H_ #define _MACRO_H_ #define EmptyTOS (-1) #define MinStackSize (5) #define ElementType int #endif //&amp;gt;&amp;...
数据结构:表达式树
摘要: (1)表达式树的树叶是操作数。其他节点为操作符。 (2)通过递归产生一个带括号的左表达式,然后打出根的操作符号,再递归的产生右表达式。这是一种中缀表达(也是中序遍历) (3)另一种方式是进行后序遍历,产生一个后缀表达式。 (4)现在给出一种教材上的构造表达式树的算法: 【1】首先输入一个后缀表达式(如果不是需要转换) 【2】依次读入元素,如果是操作数,则建立一个单节点树,并将
相关热词 c# 标准差 计算 c#siki第五季 c#入门推荐书 c# 解码海康数据流 c# xml的遍历循环 c# 取 查看源码没有的 c#解决高并发 委托 c#日期转化为字符串 c# 显示问号 c# 字典对象池