代码之家  ›  专栏  ›  技术社区  ›  TVOHM

如何在运行时构建一个范围切换大小写表达式?[复制品]

  •  0
  • TVOHM  · 技术社区  · 6 年前

    这个问题已经有了答案:

    我正在构建一个开关表达式,以便在运行时匹配整数的范围。 目前,我能够编译和运行以下等价的 Expression.SwitchCase :

    switch(value)
    {
        case 1:
        case 2:
            Console.WriteLine("1 or 2");
            break;
        case 3:
        case 4:
        case 5:
            Console.WriteLine("3, 4 or 5");
            break;
    }
    

    我的问题是-我必须为我想要匹配的范围内的每个常量创建一个switchcase:

    Expression.SwitchCase(body, Expression.Constant(1))

    Expression.SwitchCase(body, Expression.Constant(2))

    有没有更简洁的方法来实现这一点?有没有一种方法可以将常量表达式替换为根据范围计算切换值的表达式?.性能也很重要,特别是在范围较大的情况下。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Aleks Andreev Md. Suman Kabir    6 年前

    您可以使用其他重载来简化代码 Expression.SwitchCase

    只需创建一个带有测试值的数组并将其转换为 ConstantExpression . 试试这个例子:

    var writeLine = typeof(Console).GetMethod("WriteLine", new[] {typeof(string)});
    
    // body of first block
    var action1 = Expression.Call(writeLine, Expression.Constant("1 or 2"));
    // body of second block
    var action2 = Expression.Call(writeLine, Expression.Constant("3, 4 or 5"));
    
    var value = Expression.Parameter(typeof(int), "value");
    var body = Expression.Switch(value,
        Expression.SwitchCase(
          action1,
          new[] {1, 2}.Select(i => Expression.Constant(i))),
        Expression.SwitchCase(
          action2, 
          new[] {3, 4, 5}.Select(i => Expression.Constant(i)))
    );
    
    var lambda = Expression.Lambda<Action<int>>(body, value);
    var method = lambda.Compile();
    
    method(1); // print "1 or 2"
    method(4); // print "3, 4 or 5"