zoukankan      html  css  js  c++  java
  • 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));

  • 相关阅读:
    D django 用户认证系统
    vim 跳到指定行
    django 的auth.authenticate返回为None
    git fetch 的简单用法:更新远程代码到本地仓库
    sql语句查询出表里符合条件的第二条记录的方法
    你一定喜欢看的 Webpack 2.× 入门实战
    webpack 从入门到工程实践
    入门Webpack,看这篇就够了
    教程
    常用浏览器如何设置代理服务器上网(图文教程)
  • 原文地址:https://www.cnblogs.com/mokliu/p/2138183.html
Copyright © 2011-2022 走看看