NET(C#):使用Expression Tree构建带有参数、本地变量和返回值的Lambda
2017-06-08 16:51
232 查看
.NET(C#):使用Expression Tree构建带有参数、本地变量和返回值的Lambda
对于参数,需要使用Expression.Parameter创建ParameterExpression对象,注意需要在创建Lambda时传入ParameterExpression数组才可以使参数有效。对于本地变量,首先Expression类型提供Variable方法,但是这个Variable方法返回的也是ParameterExpression,实际上他们内部创建的都是同一种ParameterExpression对象,唯一的区别是Parameter方法会考虑Type.IsByRef的情况,但是Variable会抛出异常(如果Type.IsByRef为True)。其次需要注意的是,局部变量需要在创建BlockExpression时以ParameterExpression数组的方式传入。对于返回值,需要先通过Expression.Label的部分重载创建LabelTarget对象,接着通过Expression的Return方法(间接调用MakeGoto)返回GotoExpression,注意是和一个LabelTarget对象相关联的。最后用Expression.Label的另一部分返回LabelExpression的重载创建Label表达式,也就是Label在代码块中的具体位置。最后LabelTarget对象可以按照类型标记,也可以按照类型连同名称标记。 下面代码,我们要创建一个和如下方法类似的Lambda:static string doo(int i) { string str = i.ToString(); return str; }全部代码:
//+ using System.Reflection; //+ using System.Linq.Expressions; //参数 var pa = Expression.Parameter(typeof(int), "i"); //本地变量 var loc = Expression.Variable(typeof(string), "str"); //创建LabelTarget用来返回值 LabelTarget labelTarget = Expression.Label(typeof(string)); //调用i.ToString() MethodCallExpression med = Expression.Call(pa, typeof(object).GetMethod("ToString", new Type[] { })); //将结果赋值给本地字符串变量 BinaryExpression asn = Expression.Assign(loc, med); //创建返回表达式(实际上就是Goto表达式) GotoExpression ret = Expression.Return(labelTarget, loc); //创建返回表达式的目标Label LabelExpression lbl = Expression.Label(labelTarget, Expression.Constant(String.Empty)); //生成BlockExpression BlockExpression blocks = Expression.Block( new ParameterExpression[] { loc }, asn, ret, lbl); //生成Lambda表达式 Expression<Func<int, string>> lam = Expression.Lambda<Func<int, string>>(blocks, new ParameterExpression[] { pa }); //运行并输出结果 Func<int, string> del = lam.Compile(); Console.WriteLine(del(17));输出:
17
Related Posts:
.NET(C#):methodof、fieldof和ldtoken.NET(C#): Task.Unwrap扩展方法和async Lambda
使用Html Agility Pack 1.4解析HTML的DOM Tree
.NET(C#):分析IL中的if-else,while和for语句并用Emit实
相关文章推荐
- 使用Expression Tree构建带有参数、本地变量和返回值的Lambda
- js_html_input中autocomplete="off"在chrom中失效的解决办法 使用JS模拟锚点跳转 js如何获取url参数 C#模拟httpwebrequest请求_向服务器模拟cookie发送 实习期学到的技术(一) LinqPad的变量比较功能 ASP.NET EF 使用LinqPad 快速学习Linq
- 使用目录服务和 Visual C# .NET 向本地系统添加用户
- ASP.net(c#) 在ACCESS数据库中利用参数使用存储过程例子(防SQL注入)
- 【转】如何使用 ADO.NET 和 Visual C# .NET 调用带参数的存储过程
- HOW TO:使用 ADO.NET 和 Visual C# .NET 调用带参数的存储过程
- C#使用ExecuteReader返回DataReader既有查询结果集又有输出参数或返回值的使用注意事项
- 使用目录服务和 Visual C# .NET 向本地系统添加用户
- HOW TO:使用 Visual C# .NET 在 ADO.NET 中以编程方式构建连接字符串
- c#asp.net url 传递中文参数要使用 System.Web.HttpUtility.UrlEncode 而不能使用Server.UrlEncode
- ASP.net(c#) 在ACCESS数据库中利用参数使用存储过程例子(防SQL注入)
- 【C#与MYSQL】在VS中使用MYSQL connect Net 连接本地MYSQL
- 如何使用 ADO.NET 和 Visual C# .NET 调用带参数的存储过程
- 关于在C#中使用SQL语的中like及使用查询参数的一般做法__net-技术研发_百度空间
- C# 3.0新特性初步研究 Part1:使用隐含类型的本地变量
- C# 3.0新特性初步研究 Part1:使用隐含类型的本地变量_C#教程
- C# 3.0新特性初步研究 Part1:使用隐含类型的本地变量
- asp.net c#里如何使用 varchar(max) 参数
- c#asp.net url 传递中文参数要使用 System.Web.HttpUtility.UrlEncode 而不能使用Server.UrlEncode
- XSLT 中使用参数和变量以及 C# 向 XSLT 传入参数