Expression.SwitchCase匹配异常问题咨询(附MSDN示例代码)
关于Expression.SwitchCase的匹配问题解析
从你贴的代码片段来看,目前的Expression.SwitchCase定义是不完整的,这也是导致匹配逻辑失效的核心原因。我来拆解下关键问题和修复方式:
核心问题:缺少匹配测试值
Expression.SwitchCase的构造要求必须明确指定要匹配的测试值,你的代码里只写了匹配成功后执行的表达式(Console.WriteLine那部分),但没传入对应的匹配常量值——这样Switch语句根本不知道这个Case要匹配什么值,自然无法触发对应的分支逻辑。
比如一个完整合法的SwitchCase应该是这样的:
Expression.SwitchCase( // 匹配成功后执行的表达式 Expression.Call( null, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }), Expression.Constant("Matched Case 1") ), // 关键:指定这个Case要匹配的测试值 Expression.Constant(1) )
补全后的完整SwitchExpression示例
把你的代码补全后,可正常运行的版本如下:
ConstantExpression switchValue = Expression.Constant(3); // 完整的switch表达式(包含默认分支和匹配分支) SwitchExpression switchExpr = Expression.Switch( switchValue, // 默认分支:没有任何Case匹配时执行 Expression.Call( null, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }), Expression.Constant("Default") ), new SwitchCase[] { // 匹配值为1的Case Expression.SwitchCase( Expression.Call( null, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }), Expression.Constant("Matched Value 1") ), Expression.Constant(1) ), // 匹配值为3的Case(对应switchValue的值) Expression.SwitchCase( Expression.Call( null, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }), Expression.Constant("Matched Value 3") ), Expression.Constant(3) ) } ); // 编译并执行表达式 Expression.Lambda<Action>(switchExpr).Compile()();
额外注意事项
- 每个
SwitchCase可以指定多个匹配值,比如Expression.Constant(2), Expression.Constant(3),这样一个Case会同时匹配多个值 - Switch语句的匹配逻辑是按顺序检查Case,第一个匹配的Case会被执行,不会继续往下检查后续分支
- 如果你不需要默认分支,可以把Switch构造的第二个参数设为
null,但此时如果没有任何Case匹配,会抛出InvalidOperationException
内容的提问来源于stack exchange,提问作者Rm558
相关产品推荐
相关产品推荐

