系列文章: C# 表达式树及其应用 (Expression 类)
本节继续讲解Expression相关的API, 力争把相关api 都使用简短demo说明一下
- LessThanOrEqual 创建一个表示“小于或等于”数值比较的 BinaryExpression。
//LessThanOrEqual 创建一个表示“小于或等于”数值比较的 BinaryExpression。
void LessThanOrEqualSample()
{
//静态编译方式
Expression lessThanExpr = Expression.LessThanOrEqual(
Expression.Constant(42),
Expression.Constant(42)
);
Expression.Lambda<Func<bool>>(lessThanExpr).Compile()().Dump("LessThan");//true
//动态参数方式
ParameterExpression paramNum1 = Expression.Parameter(typeof(int), "num1");
ParameterExpression paramNum2 = Expression.Parameter(typeof(int), "num2");
LambdaExpression lambdaExpr = Expression.Lambda(
Expression.LessThanOrEqual(
paramNum1,
paramNum2
),
new List<ParameterExpression>() { paramNum1, paramNum2 }
);
lambdaExpr.ToString().Dump();//(num1, num2) => (num1 <= num2)
lambdaExpr.Compile().DynamicInvoke(1, 3).Dump("LessThanDynamic");//true
}
LessThanOrEqualSample();
- ListBind 创建一个 MemberListBinding 对象。
//ListBind 创建一个 MemberListBinding 对象。
void ListBindSample()
{
MethodInfo addMethod = typeof(List<int>).GetMethod("Add")!;
ElementInit e1 = Expression.ElementInit(addMethod, Expression.Constant(1));
ElementInit e2 = Expression.ElementInit(addMethod, Expression.Constant(3));
var variableBindExpr = (new ElementInit[] { e1, e2 }).AsEnumerable();
Expression testExpr = Expression.MemberInit(
Expression.New(typeof(TestListBindClass)),
new List<MemberBinding> {
Expression.ListBind(typeof(TestListBindClass).GetMember("Nums")[0],variableBindExpr)
}
);
var res = Expression.Lambda<Func<TestListBindClass>>(testExpr).Compile()();
res.ToString().Dump("ListBind");
}
ListBindSample();
- ListInit 创建一个 ListInitExpression。
//ListInit 创建一个 ListInitExpression。
void ListInitSample()
{
string tree1 = "maple";
string tree2 = "oak";
System.Reflection.MethodInfo addMethod = typeof(Dictionary<int, string>).GetMethod("Add")!;
// Create two ElementInit objects that represent the
// two key-value pairs to add to the Dictionary.
System.Linq.Expressions.ElementInit elementInit1 =
System.Linq.Expressions.Expression.ElementInit(
addMethod,
System.Linq.Expressions.Expression.Constant(tree1.Length),
System.Linq.Expressions.Expression.Constant(tree1));
System.Linq.Expressions.ElementInit elementInit2 =
System.Linq.Expressions.Expression.ElementInit(
addMethod,
System.Linq.Expressions.Expression.Constant(tree2.Length),
System.Linq.Expressions.Expression.Constant(tree2));
// Create a NewExpression that represents constructing
// a new instance of Dictionary<int, string>.
System.Linq.Expressions.NewExpression newDictionaryExpression =
System.Linq.Expressions.Expression.New(typeof(Dictionary<int, string>));
// Create a ListInitExpression that represents initializing
// a new Dictionary<> instance with two key-value pairs.
System.Linq.Expressions.ListInitExpression listInitExpression =
System.Linq.Expressions.Expression.ListInit(
newDictionaryExpression,
elementInit1,
elementInit2);
Console.WriteLine(listInitExpression.ToString());
}
ListInitSample();
本文作者:wwmin
微信公众号: DotNet技术说
本文链接:https://www.jianshu.com/p/8380ceb89736
关于博主:评论和私信会在第一时间回复。或者[直接私信]我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,关注点赞, 您的鼓励是博主的最大动力!
网友评论