`
阅读更多
原帖地址:http://www.cnblogs.com/li-peng/p/3154381.html

整理了一下表达式树的一些东西,入门足够了

先从ConstantExpression 开始一步一步的来吧  它表示具有常量值的表达式

我们选建一个控制台应用程序

ConstantExpression _constExp = Expression.Constant("aaa",typeof(string));//一个常量
//Console.Writeline("aaa");
MethodCallExpression _methodCallexp=Expression.Call(typeof(Console).GetMethod("WriteLine",new Type[]{typeof(string)}),_constExp);
Expression<Action> consoleLambdaExp = Expression.Lambda<Action>(_methodCallexp);
consoleLambdaExp.Compile()();

Console.ReadLine();

下边的MethodCallExpression你也许不知道是什么回事,不要急我下边会详细讲的,这相当于

Console.WriteLine("aaa");  输出一个常量,看一下结果

如果想自己输入一个值输出呢,那就用ParameterExpression 它表示一个参数表达式,我们只要把上边的代码做一下小改动就行

ParameterExpression _parameExp = Expression.Parameter(typeof(string), "MyParameter");

MethodCallExpression _methodCallexpP = Expression.Call(typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }), _parameExp);
Expression<Action<string>> _consStringExp = Expression.Lambda<Action<string>>(_methodCallexpP, _parameExp);
_consStringExp.Compile()("Hello!!");

参数parameExp就是一个string类型的变量我们让它输出一个Hello!!

有点感觉了吧,慢慢来好玩的还在后边,现在我们就说一下MethodCallExpression它可以调用静态方法和实例方法,我们上边的代码就是调用 的静态方法

,我先讲一下调用静态方法,再讲调用实例方法

我们建一个返回string的静态方法,传入一个object类型的值

public static string ConsStr(object str)
{
string _str = str + "aa";
Console.WriteLine(_str);
return _str;
}

看一下我们是怎么调用自己的静态方法的

ParameterExpression _paraObj = Expression.Parameter(typeof(object), "objPara");
MethodCallExpression _MyStateMethod = Expression.Call(typeof(Program).GetMethod("ConsStr", new Type[] { typeof(object) }), _paraObj);
Expression<Func<object, string>> _meyLambdaState = Expression.Lambda<Func<object, string>>(_MyStateMethod, _paraObj);
string s_tr = _meyLambdaState.Compile()("ni Hao");
Console.WriteLine("返回值: " + s_tr);

  new Type[] { typeof(object) } 就是我们的方法里的参数类型,后边的paraObj是相当于参数值了,如果 是多参数就在 Type[],和后边再加上相应 的类型和参数就行

静态方法你有些了解了,下面讲一下调用实例方法

我们写一个非静态方法

public string ConsStr2(object str)
{
string _str = str + "aa";
Console.WriteLine(_str);
return _str;
}

调用的时候只要把上边的代码改动一点就ok Expression.Call为我们提供了我们想要的重载

Program _pg = new Program();
ParameterExpression _paraObj2 = Expression.Parameter(typeof(object), "objPara");
MethodCallExpression _MyStateMethod2 = Expression.Call(Expression.Constant(_pg), typeof(Program).GetMethod("ConsStr2"), _paraObj2);
Expression<Func<object, string>> _meyLambdaState2 = Expression.Lambda<Func<object, string>>(_MyStateMethod2, _paraObj2);
string s_tr2 = _meyLambdaState.Compile()("you shi ni ");
Console.WriteLine("返回值: " + s_tr2);

   简单吧。

再下来我们讲什么呢,也许你猜到了UnaryExpression一元运算符表达式和 BinaryExpression  二元运算符表达式

我们先看一个这两个表达式的简单例子后,我们再做一个复杂的例子

UnaryExpression我们做一个5--的表达式

ConstantExpression _consNum = Expression.Constant(5, typeof(int));
UnaryExpression _unaryPlus = Expression.Decrement(_consNum);
Expression<Func<int>> _unaryLam = Expression.Lambda<Func<int>>(_unaryPlus);
Console.WriteLine(_unaryLam.Compile()());

BinaryExpression  我们做一个a+b的例子 

ParameterExpression _ParaA = Expression.Parameter(typeof(int), "a");
ParameterExpression _ParaB = Expression.Parameter(typeof(int), "b");
BinaryExpression _BinaAdd = Expression.Add(_ParaA, _ParaB);
Expression<Func<int, int, int>> _MyBinaryAddLamb = Expression.Lambda<Func<int, int, int>>(_BinaAdd, new ParameterExpression[] { _ParaA, _ParaB });
Console.WriteLine("表达式: "+ _MyBinaryAddLamb);
Console.WriteLine(_MyBinaryAddLamb.Compile()(3, 6));

  不难吧,

我们做一把两个表达式放一起做一个例子吧 (a+b)*(--c)

ParameterExpression _ParaA = Expression.Parameter(typeof(int), "a");
ParameterExpression _ParaB = Expression.Parameter(typeof(int), "b");
BinaryExpression _BinaAdd = Expression.Add(_ParaA, _ParaB); //a+b

ParameterExpression _paraC = Expression.Parameter(typeof(int), "c");
UnaryExpression _paraDecr = Expression.Decrement(_paraC); //(a+b)*(--c)
BinaryExpression _binaMultiply = Expression.Multiply(_BinaAdd, _paraDecr);
Expression<Func<int, int, int, int>> _MyBinaryLamb = Expression.Lambda<Func<int, int, int, int>>(_binaMultiply, new ParameterExpression[] { _ParaA, _ParaB, _paraC });
Console.WriteLine("表达式: "+ _MyBinaryLamb);
Console.WriteLine(_MyBinaryLamb.Compile()(3, 6, 5));

  

今天就讲到这

 

 

 

 

 

 


本文链接:http://www.cnblogs.com/li-peng/p/3154381.html,转载请注明。

分享到:
评论

相关推荐

    Expression表达式树缓存 Expression表达式树序列化

    Expression表达式树缓存 Expression表达式树序列化

    Expression表达式树动态查询.zip

    "Expression表达式树动态查询.zip"中的内容显然是关于如何使用C#表达式树来构建动态查询的示例或教程。 表达式树(Expression Tree)是将代码表示为树形结构,其中每个节点都是代码的一部分,如变量、操作符、方法...

    五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树 - 文章 - 伯乐在线1

    表达式树(Expression Trees)在C#中用于表示代码的抽象语法树(AST)。它们是一种数据结构,将代码表示为节点树,每个节点代表代码的不同部分。表达式树常用于 LINQ 查询中,允许编译器分析和操作查询表达式。例如...

    正则表达式---------资料整理,适合新手学习使用,对正则表达式的学习很有帮助

    2. 正则表达式定义:正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。 3. 正则表达式的组成部分:...

    表达式解析之表达式树的建立

    表达式树(Expression Tree)是一种树形结构,其中每个内部节点代表一个运算符,而每个叶节点则代表操作数。这种结构直观地反映了表达式的运算顺序和优先级,对于理解和处理复杂表达式非常有用。例如,表达式 "2 + 3...

    正则表达式CHM ----学习资料

    正则表达式(Regular Expression,简称regex)通过使用预定义的字符模式来识别字符串中的特定模式,从而帮助开发者高效地处理文本数据。 这个"正则表达式CHM"学习资料很可能是以CHM(Compiled Help Manual)格式...

    C#表达式树教程

    在C#编程中,表达式树(Expression Tree)是一种数据结构,它以树的形式表示了程序中的表达式。表达式树对于理解代码逻辑、编译器优化、动态代码执行以及 LINQ 查询等场景有着重要的作用。本教程将深入探讨表达式树...

    C#之Expression表达式树实例

    本文实例讲述了C#之Expression表达式树,分享给大家供大家参考。具体实现方法如下: 表达式树表示树状数据结构的代码,树状结构中的每个节点都是一个表达式,例如一个方法调用或类似 x &lt; y&gt;&gt; expr = (x, y, z) =&gt; (x...

    表达式树的应用

    ### 表达式树的应用 #### 一、动态创建表达式树 表达式树是一种用于表示编程语言中的表达式的数据结构。它将表达式转换成一个可以被编译器理解和执行的对象模型。这对于动态地创建和操作代码尤其有用。本节主要...

    EL表达式详解-----简单明了

    EL(Expression Language)表达式是一种用于JSP页面的简化脚本语言,主要用于访问存储在各种作用域中的数据。随着JSTL(JSP Standard Tag Library)的普及,EL表达式成为了处理页面逻辑的重要工具之一。本文旨在深入...

    二叉树(C语言)以及构建表达式树

    在提供的压缩包`expressiontree`中,应包含实现上述功能的源代码,如`createTree.c`用于构建表达式树,`traversal.c`包含遍历函数,`main.c`则包含测试代码。通过运行`main.c`,你可以观察到二叉树操作的实际效果,...

    06.C# 知识回顾 - 表达式树 Expression Trees.pdf

    表达式树(Expression Trees)是.NET Framework中的一个重要概念,特别是与C#语言紧密相关。表达式树允许开发者以树状结构表示代码表达式。每棵树代表一个表达式,而树的节点代表表达式中的运算符、方法调用、参数等...

    表达式求值--数据结构

    除了使用后缀表达式和栈,还可以通过其他数据结构和算法实现表达式求值,例如二叉表达式树(Binary Expression Tree)或者使用递归下降解析(Recursive Descent Parsing)。这些方法各有优缺点,适用于不同的场景和...

    表达式树Expression tree

    C++实现的表达式树。测试的组合有 3 4 + 2 * 2 3 4 * + x x - a b + * x 1 * x 3 + 2 * 3 4 5 * + 3 4 5 ^ + 3 4 5 ^ % 31 x + 42 5 ^ % xcc xc - aa bb + * x 1 % x ^ 10 + 可将上面字符复制到测试文件中,文件名写...

    C#基于表达式(Expression)实现对象深拷贝

    首先,我们需要理解什么是表达式树(Expression Tree)。表达式树是一种表示代码的抽象数据结构,它能够让我们以数据的形式查看和操作代码。在C#中,`System.Linq.Expressions`命名空间提供了构建和操作表达式树的...

    CronExpression一个cron表达式解析器

    在`mtdowling-cron-expression-3cc89f5`这个压缩包中,包含了CronExpression库的源代码。开发者可以通过阅读源代码,了解其实现细节和内部结构。这个版本可能包含了类定义、方法实现、单元测试等部分,有助于深入...

    正则表达式生成工具--Regulazy

    正则表达式(Regular Expression,简称regex)是用于在文本中匹配特定模式的强大工具,广泛应用于数据验证、搜索与替换等场景。Regulazy是一款专为简化正则表达式生成而设计的工具,旨在帮助用户快速创建符合需求的...

    Maya的Expression表达式教程

    ### Maya的Expression表达式教程 #### 10.1 表达式简介 表达式是Maya中一种强大的工具,允许用户通过编写简单的脚本来控制物体的属性。这些属性可以是物体的位置、旋转、缩放等特性。通过使用表达式,用户能够实现...

    表达式求值算法-算符优先法

    最后,我们定义了一个 `EvaluateExpression` 函数,用于计算数学表达式的值。该函数使用栈操作函数和运算符优先级函数来计算表达式的值。 算符优先法是一种高效的表达式求值算法,能够解决复杂的数学表达式的计算...

    正则表达式测试工具 Code-Architects-Regex-Tester

    正则表达式(Regular Expression,简称regex)是用于匹配字符串的一种模式,广泛应用于文本处理、数据验证、搜索和替换等场景。Code-Architects-Regex-Tester 是一款专为C#和VB开发者设计的正则表达式测试工具,旨在...

Global site tag (gtag.js) - Google Analytics