50字范文,内容丰富有趣,生活中的好帮手!
50字范文 > NET(C#):使用Expression Tree构建带有参数 本地变量和返回值的Lambda

NET(C#):使用Expression Tree构建带有参数 本地变量和返回值的Lambda

时间:2023-02-09 18:16:36

相关推荐

NET(C#):使用Expression Tree构建带有参数 本地变量和返回值的Lambda

.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 = pile();

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实

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。