系列文章: C# 表达式树及其应用 (Expression 类)
本节继续讲解Expression相关的API, 力争把相关api 都使用简短demo说明一下
- PostDecrementAssign 创建一个 UnaryExpression,它表示将原始表达式递减 1 之后再进行表达式赋值。
//PostDecrementAssign 创建一个 UnaryExpression,它表示将原始表达式递减 1 之后再进行表达式赋值。
void PostDecrementAssignSample()
{
ParameterExpression variableExpr = Expression.Variable(typeof(int), "sampleVar");
BlockExpression block = Expression.Block(
new ParameterExpression[] { variableExpr },
Expression.PostDecrementAssign(variableExpr),
Expression.PostDecrementAssign(variableExpr)
);
block.Expressions.ForEach(p => p.ToString().Dump());//sampleVar-- | sampleVar--
Expression.Lambda<Func<int>>(block).Compile()().Dump("PostDecrementAssign");//-1
}
PostDecrementAssignSample();
//PostIncrementAssign 创建一个 UnaryExpression,它表示将原始表达式递增 1 之后再进行表达式赋值。同PostDecrementAssign
- Power 创建一个表示对数进行幂运算的 BinaryExpression。
//Power 创建一个表示对数进行幂运算的 BinaryExpression。
void PowerSample()
{
var powerExpr = Expression.Power(Expression.Constant(2d), Expression.Constant(2d));
powerExpr.ToString().Dump("PowerExpr");//(2**2)
Expression.Lambda<Func<double>>(powerExpr).Compile()().Dump("Power");//2
}
PowerSample();
//PowerAssign 创建一个 BinaryExpression,它表示对表达式求幂并将结果赋回给表达式。 同AddAssign
//PreDecrementAssign 创建一个 UnaryExpression,它将表达式递减 1 并将结果赋回给表达式。同PostDecrementAssign
//PreIncrementAssign 创建一个 UnaryExpression,它将表达式递增 1 并将结果赋回给表达式。同PostDecrementAssign
- Property 创建一个表示访问属性的 MemberExpression。
//Property 创建一个表示访问属性的 MemberExpression。
void PropertySample()
{
TestBindMember obj = new TestBindMember();
obj.Num = 10;//定义class时, 带有{get;set;}的是属性, 不带的是字段
Expression propertyExpr = Expression.Property(
Expression.Constant(obj),
"Num"
);
Expression.Lambda<Func<int>>(propertyExpr).Compile()().Dump("Property");//10
}
PropertySample();
- PropertyOrField 创建一个表示访问属性或字段的 MemberExpression。
//PropertyOrField 创建一个表示访问属性或字段的 MemberExpression。
void PropertyOrFieldSample()
{
TestFieldClass obj = new TestFieldClass();
obj.num = 10;//定义class时, 带有{get;set;}的是属性, 不带的是字段
Expression propertyExpr = Expression.PropertyOrField(
Expression.Constant(obj),
"num"
);
Expression.Lambda<Func<int>>(propertyExpr).Compile()().Dump("PropertyOrField");//10
}
PropertyOrFieldSample();
- Quote [引用] 创建一个表示具有类型 UnaryExpression 的常量值的表达式的 Expression。
//Quote [引用] 创建一个表示具有类型 UnaryExpression 的常量值的表达式的 Expression。
void QuoteSample()
{
TestFieldClass obj = new TestFieldClass();
obj.num = 10;//定义class时, 带有{get;set;}的是属性, 不带的是字段
Expression propertyExpr = Expression.PropertyOrField(
Expression.Constant(obj),
"num"
);
var lambda = Expression.Lambda<Func<int>>(propertyExpr);
var res = lambda.Compile()().Dump();
Expression quote = Expression.Quote(lambda);
quote.ToString().Dump();//() => value(UserQuery+TestFieldClass).num
}
QuoteSample();
//Reduce 将此节点简化为更简单的表达式。 如果 CanReduce 返回 true,则它应返回有效的表达式。 此方法可以返回本身必须简化的另一个节点。//TODO
//ReduceAndCheck 同Reduce
//ReduceExtensions 将表达式简化为已知节点类型(即非 Extension 节点)或仅在此类型为已知类型时返回表达式。//TODO
//ReferenceEqual 创建一个表示引用相等比较的 BinaryExpression。//TODO
//ReferenceNotEqual 同ReferenceEqual
//Rethrow 创建一个 UnaryExpression,它表示重新引发异常。//TODO
本文作者:wwmin
微信公众号: DotNet技术说
本文链接:https://www.jianshu.com/p/8a9f338abafb
关于博主:评论和私信会在第一时间回复。或者[直接私信]我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,关注点赞, 您的鼓励是博主的最大动力!
网友评论