• 学习ExpressionTree(做装配脑袋出的练习题)


     1             // 第一题:画出下列表达式的表达式树。一开始,您很可能不知道某些操作其实也是表达式(比如取数组的运算符a[2]),不过没有关系,后面的习题将帮你验证这一点。
     2 
     3             //-a
     4             ParameterExpression e1 = Expression.Variable(typeof(int), "a");
     5             UnaryExpression u = Expression.Negate(e1);//求反的表达式
     6             Console.WriteLine(u);
     7 
     8             //a + b * 2
     9             ParameterExpression a = Expression.Variable(typeof(double), "a");
    10             ParameterExpression b = Expression.Variable(typeof(double), "b");
    11             ConstantExpression t = Expression.Constant(2d,typeof(double));
    12             BinaryExpression cf = Expression.Multiply(b, t);
    13             BinaryExpression jf = Expression.Add(a, cf);
    14             Console.WriteLine(jf);
    15 
    16            // Math.Sin(x) + Math.Cos(y)
    17             ParameterExpression px = Expression.Parameter(typeof(double), "x");
    18             MethodCallExpression sin = Expression.Call(null, typeof(Math).GetMethod("Sin", BindingFlags.Static | BindingFlags.Public), px);
    19 
    20             ParameterExpression py = Expression.Parameter(typeof(double), "y");
    21             MethodCallExpression cos = Expression.Call(null,
    22                 typeof(Math).GetMethod("Cos", BindingFlags.Public | BindingFlags.Static), py);
    23 
    24             BinaryExpression jf = Expression.Add(sin, cos);
    25 
    26             Console.WriteLine(jf.ToString());
    27 
    28            // new StringBuilder(“Hello”)
    29             ConstantExpression s = Expression.Constant("Hello", typeof(string));
    30             NewExpression n = Expression.New(typeof(StringBuilder).GetConstructor(new Type[] { typeof(string) }), s);
    31             Console.WriteLine(n.ToString());
    32 
    33            // new int[] { a, b, a + b}
    34             ParameterExpression a = Expression.Variable(typeof(int), "a");
    35             ParameterExpression b = Expression.Variable(typeof(int), "b");
    36             BinaryExpression c = Expression.Add(a, b);
    37             NewArrayExpression n = Expression.NewArrayInit(typeof(int),a,b,c);
    38             Console.WriteLine(n);
    39             //a[i – 1] * i
    40             ParameterExpression pi = Expression.Variable(typeof(int), "i");
    41             ConstantExpression o = Expression.Constant(1, typeof(int));
    42             BinaryExpression j = Expression.Subtract(pi, o);
    43             ParameterExpression arr = Expression.Variable(typeof(int[]),"a");
    44             IndexExpression t = Expression.ArrayAccess(arr, j);
    45 
    46             BinaryExpression cf = Expression.Multiply(t, pi);
    47             Console.WriteLine(cf);
    48 
    49             a.Length > b | b >= 0
    50             ParameterExpression a = Expression.Variable(typeof(string), "a");
    51             MemberExpression m = Expression.Property(a, typeof(string).GetProperty("Length"));
    52             ParameterExpression b = Expression.Variable(typeof(int), "b");
    53             BinaryExpression g = Expression.GreaterThan(m, b);
    54 
    55             ConstantExpression z = Expression.Constant(0, typeof(int));
    56             BinaryExpression b2 = Expression.GreaterThanOrEqual(b, z);
    57 
    58             BinaryExpression b3 = Expression.Or(g, b2);
    59             Console.WriteLine(b3);
    60 
    61             //(高难度)new System.Windows.Point() { X = Math.Sin(a), Y = Math.Cos(a) }
    62             NewExpression n = Expression.New(typeof(System.Windows.Point));//new System.Windows.Point() 
    63             ParameterExpression a = Expression.Variable(typeof(double), "a");
    64             MethodCallExpression sin = Expression.Call(null, typeof(Math).GetMethod("Sin"), a);
    65             UnaryExpression sinD = Expression.Convert(sin, typeof(double));
    66             MethodCallExpression cos = Expression.Call(null, typeof(Math).GetMethod("Cos"), a);
    67             UnaryExpression cosD = Expression.Convert(cos, typeof(double));
    68             MemberAssignment as1 = Expression.Bind(typeof(System.Windows.Point).GetProperty("X"), sinD);
    69             MemberAssignment as2 = Expression.Bind(typeof(System.Windows.Point).GetProperty("Y"), cosD);
    70 
    71             MemberInitExpression mm = Expression.MemberInit(n, as1, as2);
    72 
    73             LambdaExpression le = Expression.Lambda(mm, a);
    74             
    75             Console.WriteLine(le.Body);
    76 
    77             //提示:注意运算符的优先级。倒数第二题的a是String类型,其余变量你可以用任意合适的简单类型。如果想知道以上表达式分别是什么表达式,可以查MSDN。
  • 相关阅读:
    136-如何访问redis数据库
    135-如何实现result风格
    134-SpringMVC中的值,会有一个默认值
    133-this知识点
    132-SpringBoot中的请求方法
    034-405是什么错误?
    131-逆向工程配置文件
    SQL---实验一
    《将博客搬至CSDN》
    正则表达式1---QQ号合法性判断
  • 原文地址:https://www.cnblogs.com/Johnzhang/p/3580389.html
Copyright © 2020-2023  润新知