Expression.SwitchCase匹配问题

时间:2018-05-08 19:14:21

标签: c# lambda expression

这是从MSDN复制的示例。

ConstantExpression switchValue = Expression.Constant(3);

// This expression represents a switch statement 
// that has a default case.
SwitchExpression switchExpr =
    Expression.Switch(
        switchValue,
        Expression.Call(
                    null,
                    typeof(Console).GetMethod("WriteLine", new Type[] { typeof(String) }),
                    Expression.Constant("Default")
                ),
        new SwitchCase[] {
            Expression.SwitchCase(
                Expression.Call(
                    null,
                    typeof(Console).GetMethod("WriteLine", new Type[] { typeof(String) }),
                    Expression.Constant("First")
                ),
                Expression.Constant(1)
            ),
            Expression.SwitchCase(
                Expression.Call(
                    null,
                    typeof(Console).GetMethod("WriteLine", new Type[] { typeof(String) }),
                    Expression.Constant("Second")
                ),
                Expression.Constant(2)
            )
        }
    );

// The following statement first creates an expression tree,
// then compiles it, and then runs it.
Expression.Lambda<Action>(switchExpr).Compile()();
//Default

工作正常,将“默认”打印到控制台。

我的问题是如何制作一个属于下一个案例的表达式(“First”)。这是我试过的:

ParameterExpression pe = Expression.Parameter(typeof(int));
Expression.Lambda<Action<int>>(switchExpr,pe).Compile()(1);
//
ParameterExpression peo = Expression.Parameter(typeof(object));
object o = 1;
Expression.Lambda<Action<object>>(switchExpr, peo).Compile()(o);

他们都没有打印出“First”来控制台。怎么了? THX。

更新

我认为MSDN的代码不是一个完美的例子,为什么要打开常量?

2 个答案:

答案 0 :(得分:2)

在此页面上显示的示例中,您可以看到如何打印“Second”值:

https://msdn.microsoft.com/en-us/library/system.linq.expressions.switchcase(v=vs.110).aspx

您的示例根本没有使用该值,而是使用示例开头的固定3:

ConstantExpression switchValue = Expression.Constant(3);

希望它有所帮助。

答案 1 :(得分:0)

感谢@Ignacio解决问题。

这是我提出的代码。 enter image description here

完整代码

ParameterExpression pe = Expression.Parameter(typeof(int));

SwitchExpression switchExpr =
    Expression.Switch(
        pe,
        Expression.Call(
                    null,
                    typeof(Console).GetMethod("WriteLine", new Type[] { typeof(String) }),
                    Expression.Constant("Default")
                ),
        new SwitchCase[] {
            Expression.SwitchCase(
                Expression.Call(
                    null,
                    typeof(Console).GetMethod("WriteLine", new Type[] { typeof(String) }),
                    Expression.Constant("First")
                ),
                Expression.Constant(1)
            ),
            Expression.SwitchCase(
                Expression.Call(
                    null,
                    typeof(Console).GetMethod("WriteLine", new Type[] { typeof(String) }),
                    Expression.Constant("Second")
                ),
                Expression.Constant(2)
            )
        }
    );

var action = Expression.Lambda<Action<int>>(switchExpr,pe).Compile();
action(1);
action(2);
action(3);