c#中泛型表达式树备忘

c#3.0中引入了表达式树,使用泛型表达式树可以方便的解决问题。举一个简单的例子,我们可以使用它来完成不同类型的数值的加减乘除。首先,来看一下简单的思路:(下述代码仅仅以加法运算来示例)

    static class Calculate<T>
    {
        public static T Add(T num1, T num2)
        {
            return num1 + num2;
        }
    }

     然而这个代码编译是不能通过的,因为泛型不可以进行相加的操作。这种简单的思路行不通,下面来看使用表达式树的解决方案:

    static class Calculate<T>
    {
        public static T Add(T num1, T num2)
        {
            //创建参数表达式树节点1
            ParameterExpression p1 = Expression.Parameter(typeof(T), "left");
            //创建参数表达式树节点2
            ParameterExpression p2 = Expression.Parameter(typeof(T), "right");
            //两个参数节点构成二叉树节点,节点关系为求和
            BinaryExpression p_add = Expression.Add(p1, p2);
            //定义lambda表达式,这个可以看一下msdn的说明,(Func<T,T,T>也是一个类型)
            Expression<Func<T, T, T>> fe = Expression.Lambda
                <Func<T, T, T>>(p_add, new ParameterExpression[] { p1, p2 });
            //转化为匿名代理
            Func<T, T, T> fc = fe.Compile();
            //返回结果
            return fc(num1, num2);
        }
    }

       这样就可以对不同类型的数值进行加操作了:

        Console.WriteLine(Calculate<int>.add(3, 5));

原文地址:https://www.cnblogs.com/mokliu/p/2138183.html