系列文章: C# 表达式树及其应用 (Expression 类)
本节继续讲解Expression相关的API, 力争把相关api 都使用简短demo说明一下
- Break 创建一个表示 break 语句的 GotoExpression。结合Loop 和 IfThenElse 等循环判断语句
//Break 创建一个表示 break 语句的 GotoExpression。结合Loop 和 IfThenElse 等循环判断语句
void BreakSample()
{
ParameterExpression valueBreak = Expression.Parameter(typeof(int), "value");
ParameterExpression resultBreak = Expression.Parameter(typeof(int), "result");
LabelTarget labelBreak = Expression.Label(typeof(int));
BlockExpression blockBreak = Expression.Block(
new[] { resultBreak },
Expression.Assign(resultBreak, Expression.Constant(1)),
Expression.Loop(
Expression.IfThenElse(
Expression.GreaterThan(valueBreak, Expression.Constant(1)),
Expression.MultiplyAssign(resultBreak,
Expression.PostDecrementAssign(valueBreak)),
Expression.Break(labelBreak, resultBreak)
),
labelBreak
)
);
blockBreak.Expressions.ForEach(p =>
{
if (p is LoopExpression loopExpression) loopExpression.Body.ToString().Dump();
//IIF((value > 1), (result *= value--), break UnnamedLabel_0 (result))
else p.ToString().Dump();//(result = 1)
});
Expression.Lambda<Func<int, int>>(blockBreak, valueBreak).Compile()(5).Dump(); //120
Expression callExpr = Expression.Call(
Expression.New(typeof(SmapleClass)),
typeof(SmapleClass).GetMethod("AddIntegers", new Type[] { typeof(int), typeof(int) })!,
Expression.Constant(1),
Expression.Constant(2)
);
callExpr.ToString().Dump();//new SmapleClass().AddIntegers(1, 2)
Expression.Lambda<Func<int>>(callExpr).Compile()().Dump();//3
//创建不带参数调用的表达式
var callSampleStringExpr = Expression.Call(Expression.Constant("sample string"), typeof(String).GetMethod("ToUpper", new Type[] { })!);
Expression.Lambda<Func<string>>(callSampleStringExpr).Compile()().Dump();//SAMPLE STRING
}
BreakSample();
- Catch (类似与 TryCatch) 创建一个表示 catch 语句的 CatchBlock。
//Catch (类似与 TryCatch) 创建一个表示 catch 语句的 CatchBlock。
void CatchSample()
{
TryExpression tryCatchExpr =
Expression.TryCatch(
Expression.Block(
Expression.Throw(Expression.Constant(new DivideByZeroException())),
Expression.Constant("try block")
),
Expression.Catch(
typeof(DivideByZeroException),
Expression.Constant("catch block")
)
);
Expression.Lambda<Func<string>>(tryCatchExpr).Compile()().Dump();//catch block
}
CatchSample();
-
ClearDebug 创建一个用于清除序列点的 DebugInfoExpression。 //TODO
-
Coalesce (?? 运算符) 创建一个表示合并运算的 BinaryExpression。
public class Person
{
public string Name { get; set; } = null!;
public string GetName() => this.Name;
public string GetOrSetName(string name)
{
if (this.Name == null) this.Name = name;
return this.Name;
}
}
//Coalesce (?? 运算符) 创建一个表示合并运算的 BinaryExpression。
void CoalesceSample()
{
ParameterExpression varCoalesceExpr = Expression.Variable(typeof(string), "sampleVar");
Expression callPersonNameExpr = Expression.Call(
Expression.New(typeof(Person)),
typeof(Person).GetMethod("GetName")!
);
var assignCoalesceNullExpr = Expression.Assign(varCoalesceExpr, Expression.Coalesce(callPersonNameExpr, Expression.Constant("??赋值成功")));
var blockCoalesceExpr = Expression.Block(new ParameterExpression[] { varCoalesceExpr }, assignCoalesceNullExpr);
blockCoalesceExpr.Expressions.ForEach(p => p.ToString().Dump()); //(sampleVar = (new Person().GetName() ?? "??赋值成功"))
Expression.Lambda<Func<string>>(blockCoalesceExpr).Compile()().Dump(); // ??赋值成功
}
CoalesceSample();
本文作者:wwmin
微信公众号: DotNet技术说
本文链接:https://www.jianshu.com/p/f4bf3b92a530
关于博主:评论和私信会在第一时间回复。或者[直接私信]我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,关注点赞, 您的鼓励是博主的最大动力!
网友评论