系列文章: C# 表达式树及其应用 (Expression 类)
本节继续讲解Expression相关的API, 力争把相关api 都使用简短demo说明一下
- Label 创建一个表示标签的 LabelTarget。
//Label 创建一个表示标签的 LabelTarget。
void LabelSample()
{
LabelTarget returnTarget = Expression.Label();
BlockExpression blockExpr =
Expression.Block(
Expression.Call(typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) })!, Expression.Constant("Return")),
Expression.Return(returnTarget),
Expression.Call(typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) })!, Expression.Constant("Other Work")),
Expression.Label(returnTarget)
);
Expression.Lambda<Action>(blockExpr).Compile()();//Return
}
LabelSample();
- Lambda 创建一个表示 Lambda 表达式的表达式树。
//Lambda 创建一个表示 Lambda 表达式的表达式树。
void LambdaSample()
{
ParameterExpression paramExpr = Expression.Parameter(typeof(int), "arg");
LambdaExpression lambdaExpr = Expression.Lambda(
Expression.Add(
paramExpr,
Expression.Constant(1)
),
new List<ParameterExpression>() { paramExpr }
);
lambdaExpr.ToString().Dump("Lambda");//arg => (arg + 1)
Console.WriteLine(lambdaExpr.Compile().DynamicInvoke(1));//2
}
LambdaSample();
- LeftShift 创建一个表示按位左移(<<)运算的 BinaryExpression。
//LeftShift 创建一个表示按位左移(<<)运算的 BinaryExpression。
//按位左移:将第一个操作数向左移动第二个操作数指定的位数,空出的位置补0。
//解释:左移相当于乘. 左移一位相当于乘2;左移两位相当于乘4;左移三位相当于乘8。x<<1=x*2
//同理:右移相当于整除. 右移一位相当于除以2;右移两位相当于除以4;右移三位相当于除以8。x>>1=x/2
void LeftShiftSample()
{
ParameterExpression paramExpr = Expression.Parameter(typeof(int), "arg");
ParameterExpression paramExpr2 = Expression.Parameter(typeof(int), "num");
LambdaExpression lambdaExpr = Expression.Lambda(
Expression.LeftShift(
paramExpr,
paramExpr2
),
new List<ParameterExpression>() { paramExpr, paramExpr2 }
);
lambdaExpr.ToString().Dump();//(arg, num) => (arg << num)
lambdaExpr.Compile().DynamicInvoke(1, 2).Dump("LeftShift");//4
}
LeftShiftSample();
- LeftShiftAssign 创建一个表示按位左移赋值(<<=)运算的 BinaryExpression。
//LeftShiftAssign 创建一个表示按位左移赋值(<<=)运算的 BinaryExpression。
void LeftShiftAssignSample()
{
ParameterExpression varsample = Expression.Variable(typeof(int), "sampleVar");
Expression assignExpr = Expression.Assign(varsample, Expression.Constant(1));
Expression exclusiveOrAssignExpr = Expression.LeftShiftAssign(varsample, Expression.Constant(3));
exclusiveOrAssignExpr.ToString().Dump();//(sampleVar <<= 3)
var blockExpr = Expression.Block(new ParameterExpression[] { varsample }, assignExpr, exclusiveOrAssignExpr);
Expression.Lambda<Func<int>>(blockExpr).Compile()().Dump("LeftShiftAssign");//8
}
LeftShiftAssignSample();
- LessThan 创建一个表示“小于”数值比较的 BinaryExpression。
//LessThan 创建一个表示“小于”数值比较的 BinaryExpression。
void LessThanSample()
{
//静态编译方式
Expression lessThanExpr = Expression.LessThan(
Expression.Constant(42),
Expression.Constant(42)
);
Expression.Lambda<Func<bool>>(lessThanExpr).Compile()().Dump("LessThan");//false
//动态参数方式
ParameterExpression paramNum1 = Expression.Parameter(typeof(int), "num1");
ParameterExpression paramNum2 = Expression.Parameter(typeof(int), "num2");
LambdaExpression lambdaExpr = Expression.Lambda(
Expression.LessThan(
paramNum1,
paramNum2
),
new List<ParameterExpression>() { paramNum1, paramNum2 }
);
lambdaExpr.ToString().Dump();//(num1, num2) => (num1 < num2)
lambdaExpr.Compile().DynamicInvoke(1, 3).Dump("LessThanDynamic");//true
}
LessThanSample();
本文作者:wwmin
微信公众号: DotNet技术说
本文链接:https://www.jianshu.com/p/623ea39f46d1
关于博主:评论和私信会在第一时间回复。或者[直接私信]我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,关注点赞, 您的鼓励是博主的最大动力!
网友评论