系列文章: C# 表达式树及其应用 (Expression 类)
本节继续讲解Expression相关的API, 力争把相关api 都使用简短demo说明一下
- Loop 创建一个 LoopExpression。
//Loop 创建一个 LoopExpression。
void LoopSample()
{
ParameterExpression value = Expression.Parameter(typeof(int), "value");
// Creating an expression to hold a local variable.
ParameterExpression result = Expression.Parameter(typeof(int), "result");
// Creating a label to jump to from a loop.
LabelTarget label = Expression.Label(typeof(int));
// Creating a method body.
BlockExpression block = Expression.Block(
new[] { result },
Expression.Assign(result, Expression.Constant(1)),
Expression.Loop(
Expression.IfThenElse(
Expression.GreaterThan(value, Expression.Constant(1)),
Expression.MultiplyAssign(result,
Expression.PostDecrementAssign(value)),
Expression.Break(label, result)
),
label
)
);
// Compile and run an expression tree.
int factorial = Expression.Lambda<Func<int, int>>(block, value).Compile()(5);
Console.WriteLine(factorial);//120
}
LoopSample();
- MakeBinary 通过调用适当的工厂方法来创建一个 BinaryExpression。
//MakeBinary 通过调用适当的工厂方法来创建一个 BinaryExpression。
void MakeBinarySample()
{
System.Linq.Expressions.BinaryExpression binaryExpression =
System.Linq.Expressions.Expression.MakeBinary(
System.Linq.Expressions.ExpressionType.Subtract,
System.Linq.Expressions.Expression.Constant(53),
System.Linq.Expressions.Expression.Constant(14));
Console.WriteLine(binaryExpression.ToString());//(53 - 14)
}
MakeBinarySample();
//MakeCatchBlock 创建一个表示具有指定元素的 catch 语句的 CatchBlock。 //TODO
//MakeDynamic 创建一个表示动态操作的 DynamicExpression。//TODO
//MakeGoto 创建一个 GotoExpression,它表示指定的 GotoExpressionKind 的跳转。 也可以指定在跳转时传递给标签的值。//TODO
//MakeIndex 创建一个 IndexExpression,它表示访问对象中的索引属性。//TODO
//MakeMemberAccess 创建一个表示访问字段或属性的 MemberExpression。//TODO
//MakeTry 创建一个表示具有指定元素的 try 块的 TryExpression。//TODO
//MakeUnary 通过调用适当的工厂方法来创建一个 UnaryExpression。 //TODO
//MemberBind 创建一个表示递归初始化某个成员的成员的 MemberMemberBinding。//TODO
- MemberInit 表示一个表达式,该表达式创建新对象并初始化该对象的一个属性。
//Field 创建一个表示访问字段的 MemberExpression。
public class TestFieldClass
{
public int num = 10;
}
//MemberInit 表示一个表达式,该表达式创建新对象并初始化该对象的一个属性。
void MemberInitSample()
{
// This expression creates a new TestMemberInitClass object
// and assigns 10 to its num property.
Expression testExpr = Expression.MemberInit(
Expression.New(typeof(TestFieldClass)),
new List<MemberBinding>() {
Expression.Bind(typeof(TestFieldClass).GetMember("num")[0], Expression.Constant(10))
}
);
var tree = Expression.Lambda<Func<TestFieldClass>>(testExpr).Compile();
var test = tree();
Console.WriteLine(test.num);//10
}
MemberInitSample();
- Modulo 创建一个表示算术余数运算的 BinaryExpression。
//Modulo 创建一个表示算术余数运算的 BinaryExpression。
void ModuloSample()
{
Expression sumExpr = Expression.Modulo(Expression.Constant(3), Expression.Constant(2));
Console.WriteLine(sumExpr.ToString());//(3%2)
Expression.Lambda<Func<int>>(sumExpr).Compile()().Dump("ModuloAssign 余数运算");//1
}
ModuloSample();
- ModuloAssign 创建一个表示余数赋值运算的 BinaryExpression。
//ModuloAssign 创建一个表示余数赋值运算的 BinaryExpression。
void ModuloAssignSample()
{
ParameterExpression variableExpr = Expression.Variable(typeof(int), "sampleVar");
BlockExpression block = Expression.Block(
new ParameterExpression[] { variableExpr },
Expression.Assign(variableExpr, Expression.Constant(3)),
Expression.ModuloAssign(
variableExpr,
Expression.Constant(2)
)
);
block.Expressions.ForEach(p => p.ToString().Dump());//(sampleVar = 3) | (sampleVar %= 2)
Expression.Lambda<Func<int>>(block).Compile()().Dump("ModuloAssign 余数赋值运算");//1
}
ModuloAssignSample();
本文作者:wwmin
微信公众号: DotNet技术说
本文链接:https://www.jianshu.com/p/70df382bd9ab
关于博主:评论和私信会在第一时间回复。或者[直接私信]我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,关注点赞, 您的鼓励是博主的最大动力!
网友评论