系列文章: C# 表达式树及其应用 (Expression 类)
本节继续讲解Expression相关的API, 力争把相关api 都使用简短demo说明一下
- Condition 创建一个表示条件语句的 ConditionalExpression。
//Condition 创建一个表示条件语句的 ConditionalExpression。
void ConditionSample()
{
int conditionNum = 100;
Expression conditionExpr = Expression.Condition(
Expression.Constant(conditionNum > 10),
Expression.Constant("num is greater than 10"),
Expression.Constant("num is smaller than 10")
);
conditionExpr.ToString().Dump();//IIF(True, "num is greater than 10", "num is smaller than 10")
Expression.Lambda<Func<string>>(conditionExpr).Compile()().Dump();//num is greater than 10
}
ConditionSample();
- Constant 创建一个 ConstantExpression。
//Constant 创建一个 ConstantExpression。
//创建一个可以为null的常量表达式
void ConstantSample()
{
Expression constantNullalbeExpr = Expression.Constant(null, typeof(int?));
var coaleasceExpr = Expression.Coalesce(constantNullalbeExpr, Expression.Constant(123456));
var varCoalesceNullableExpr = Expression.Variable(typeof(int), "sampleVar");
var assignNullableExpr = Expression.Assign(varCoalesceNullableExpr, coaleasceExpr);
var blockAssignNullableExpr = Expression.Block(new ParameterExpression[] { varCoalesceNullableExpr }, assignNullableExpr);
blockAssignNullableExpr.Expressions.ForEach(p => p.ToString().Dump());//(sampleVar = (null ?? 123456))
Expression.Lambda<Func<int>>(blockAssignNullableExpr).Compile()().Dump();//123456
}
ConstantSample();
- Continue 创建一个表示 continue 语句的 GotoExpression。
//Continue 创建一个表示 continue 语句的 GotoExpression。
void ContinueSample()
{
LabelTarget breakLabel = Expression.Label();
LabelTarget continueLabel = Expression.Label();
Expression continueExpr = Expression.Continue(continueLabel);
ParameterExpression count = Expression.Parameter(typeof(int));
Expression loopExpr = Expression.Loop(
Expression.Block(
Expression.IfThen(
Expression.GreaterThan(count, Expression.Constant(3)),
Expression.Break(breakLabel)
),
Expression.PreIncrementAssign(count),
Expression.Call(
null,
typeof(Console).GetMethod("WriteLine", new Type[] { typeof(String) })!,
Expression.Constant("Loop")
),
continueExpr,
Expression.PreDecrementAssign(count)
),
breakLabel,
continueLabel
);
Expression.Lambda<Action<int>>(loopExpr, count).Compile()(1);
}
ContinueSample();//Loop Loop Loop
- Convert 创建一个表示类型转换运算的 UnaryExpression。
//Convert 创建一个表示类型转换运算的 UnaryExpression。
void ConvertSample()
{
Expression convertExpr = Expression.Convert(
Expression.Constant(5.5),
typeof(Int16)
);
convertExpr.ToString().Dump();//Convert(5.5, Int16)
Expression.Lambda<Func<Int16>>(convertExpr).Compile()().Dump();//5
}
ConvertSample();
//ConvertChecked (类似与 Convert) 创建一个 UnaryExpression,它表示在目标类型发生溢出时引发异常的转换运算。
本文作者:wwmin
微信公众号: DotNet技术说
本文链接:https://www.jianshu.com/p/3115571ad699
关于博主:评论和私信会在第一时间回复。或者[直接私信]我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,关注点赞, 您的鼓励是博主的最大动力!
网友评论