美文网首页
C# 表达式树 (10)

C# 表达式树 (10)

作者: wwmin_ | 来源:发表于2021-02-01 20:20 被阅读0次

系列文章: 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 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,关注点赞, 您的鼓励是博主的最大动力!

相关文章

  • C# 表达式树 (10)

    系列文章: C# 表达式树及其应用 (Expression 类)[https://www.jianshu.com/...

  • C# 表达式树 (3)

    系列文章: C# 表达式树及其应用 (Expression 类)[https://www.jianshu.com/...

  • C# 表达式树 (6)

    系列文章: C# 表达式树及其应用 (Expression 类)[https://www.jianshu.com/...

  • C# 表达式树 (2)

    系列文章: C# 表达式树及其应用 (Expression 类)[https://www.jianshu.com/...

  • C# 表达式树 (1)

    系列文章: C# 表达式树及其应用 (Expression 类)[https://www.jianshu.com/...

  • C# 表达式树 (4)

    系列文章: C# 表达式树及其应用 (Expression 类)[https://www.jianshu.com/...

  • C# 表达式树 (5)

    系列文章: C# 表达式树及其应用 (Expression 类)[https://www.jianshu.com/...

  • C# 表达式树 (7)

    系列文章: C# 表达式树及其应用 (Expression 类)[https://www.jianshu.com/...

  • C# 表达式树 (9)

    系列文章: C# 表达式树及其应用 (Expression 类)[https://www.jianshu.com/...

  • C# 表达式树 (14)

    系列文章: C# 表达式树及其应用 (Expression 类)[https://www.jianshu.com/...

网友评论

      本文标题:C# 表达式树 (10)

      本文链接:https://www.haomeiwen.com/subject/rbustltx.html