系列文章: C# 表达式树及其应用 (Expression 类)
本节继续讲解Expression相关的API, 力争把相关api 都使用简短demo说明一下
- ElementInit 创建 ElementInit。
//ElementInit 创建 ElementInit。
void ElementInitSample()
{
string tree = "maple";
MethodInfo addMethod = typeof(Dictionary<int, string>).GetMethod("Add")!;
ElementInit elementInit = Expression.ElementInit(addMethod, Expression.Constant(tree.Length), Expression.Constant(tree));
elementInit.ToString().Dump();//Void Add(Int32, System.String)(5, "maple")
}
ElementInitSample();
- Empty 创建具有 Void 类型的空表达式。
//Empty 创建具有 Void 类型的空表达式。
//如果需要表达式,但不需要执行任何操作,则可以使用空表达式。 例如,你可以使用空表达式作为块表达式中的最后一个表达式。 在这种情况下,块表达式的返回值为 void。
void EmptySample()
{
DefaultExpression emptyExpr = Expression.Empty();
var emptyBlock = Expression.Block(emptyExpr);//return value is void
emptyBlock.Expressions.ForEach(p => p.ToString().Dump());//default(Void)
}
EmptySample();
- Equal 创建一个表示相等比较的 BinaryExpression。
//Equal 创建一个表示相等比较的 BinaryExpression。
void EqualSample()
{
Expression equalExpr = Expression.Equal(Expression.Constant(1, typeof(int)), Expression.Constant(2, typeof(int)));
equalExpr.ToString().Dump();//(1 == 2)
Expression.Lambda<Func<bool>>(equalExpr).Compile()().Dump();//False
}
EqualSample();
- ExclusiveOr 创建一个表示按位 BinaryExpression 运算的 XOR。
//ExclusiveOr 创建一个表示按位 BinaryExpression 运算的 XOR。
void ExclusiveOrSample()
{
Expression exclusiveOrExpr = Expression.ExclusiveOr(Expression.Constant(5), Expression.Constant(3));
// The XOR operation is performed as follows:
// 101 xor 011 = 110
exclusiveOrExpr.ToString().Dump();//(5 ^ 3)
Expression.Lambda<Func<int>>(exclusiveOrExpr).Compile()().Dump();//6
}
ExclusiveOrSample();
- ExclusiveOr 创建一个表示按位 BinaryExpression 运算的 XOR。
//ExclusiveOr 创建一个表示按位 BinaryExpression 运算的 XOR。
void ExclusiveOrAssignSample()
{
ParameterExpression varsample = Expression.Variable(typeof(int), "sampleVar");
Expression assignExpr = Expression.Assign(varsample, Expression.Constant(5));
Expression exclusiveOrAssignExpr = Expression.ExclusiveOrAssign(varsample, Expression.Constant(3));
// The XOR operation is performed as follows:
// 101 xor 011 = 110
exclusiveOrAssignExpr.ToString().Dump();//(sampleVar ^= 3)
var blockExpr = Expression.Block(new ParameterExpression[] { varsample }, assignExpr, exclusiveOrAssignExpr);
Expression.Lambda<Func<int>>(blockExpr).Compile()().Dump();//6
}
ExclusiveOrAssignSample();
- 创建一个表示访问字段的 MemberExpression
//创建一个表示访问字段的 MemberExpression
void FieldSample()
{
TestFieldClass obj = new TestFieldClass();
Expression fieldExpr = Expression.Field(Expression.Constant(obj), "num");
fieldExpr.ToString().Dump();//value(Program+TestFieldClass).num
Expression.Lambda<Func<int>>(fieldExpr).Compile()().Dump();//10
//给字段赋值
var assignExpr = Expression.Assign(fieldExpr, Expression.Constant(20));
//带有返回值
var blockWithReturnExpr = Expression.Block(fieldExpr, assignExpr);
Expression.Lambda<Func<int>>(blockWithReturnExpr).Compile()().Dump("带有返回值的赋值操作");
//不带有返回值
var blockExpr = Expression.Block(fieldExpr, assignExpr, Expression.Empty());
Expression.Lambda<Action>(blockExpr).Compile()();//20
obj.num.Dump();
}
FieldSample();
//GetActionType(Type[]) 创建一个 Type 对象,该对象表示具有特定类型参数的泛型 System.Action 委托类型。//TODO
//GetDelegateType(Type[]) 获取一个 Type 对象,表示具有特定类型参数的泛型 System.Func 或 System.Action 委托类型。//TODO
//GetFuncType(Type[]) 创建一个 Type 对象,该对象表示System.Func具有特定类型参数的泛型 system.exception 委托类型。 最后一个类型参数指定已创建委托的返回类型。//TODO
本文作者:wwmin
微信公众号: DotNet技术说
本文链接:https://www.jianshu.com/p/be8fee0c6a36
关于博主:评论和私信会在第一时间回复。或者[直接私信]我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,关注点赞, 您的鼓励是博主的最大动力!
网友评论