如何将StartsWith()作为参数传入Expression.Call()方法?
C#表达式树调用StartsWith()方法的正确姿势
StartsWith是string的实例方法,构建表达式树时要明确三个核心:调用方法的字符串实例、StartsWith的方法信息、方法所需的参数。
基础用法示例
比如要实现"Hello World".StartsWith("Hello")的表达式树,代码如下:
// 1. 定义调用方法的字符串常量 var targetExpr = Expression.Constant("Hello World"); // 2. 定义前缀参数常量 var prefixExpr = Expression.Constant("Hello"); // 3. 获取string.StartsWith(string)这个重载的方法信息 var startsWithMethod = typeof(string).GetMethod( nameof(string.StartsWith), new[] { typeof(string) } ); // 4. 构造方法调用表达式 var startsWithCallExpr = Expression.Call( targetExpr, // 调用方法的字符串实例 startsWithMethod, // 要调用的StartsWith方法 prefixExpr // 方法的前缀参数 );
带比较规则的重载用法
如果需要忽略大小写这类需求,就用带StringComparison的重载:
var targetExpr = Expression.Constant("Hello World"); var prefixExpr = Expression.Constant("hello"); // 获取带StringComparison参数的重载 var startsWithMethod = typeof(string).GetMethod( nameof(string.StartsWith), new[] { typeof(string), typeof(StringComparison) } ); // 定义比较规则常量 var comparisonExpr = Expression.Constant(StringComparison.OrdinalIgnoreCase); // 构造调用表达式,传入两个参数 var startsWithCallExpr = Expression.Call( targetExpr, startsWithMethod, prefixExpr, comparisonExpr );
关键点说明
- 不能直接传
StartsWith这个方法名,必须通过typeof(string).GetMethod()获取正确的方法信息,因为表达式树需要明确知道调用的是哪个重载。 - 如果你的目标字符串不是常量,而是某个参数表达式(比如从外部传入的变量),把
targetExpr换成Expression.Parameter(typeof(string), "input")即可。
内容的提问来源于stack exchange,提问作者charthraxis
相关产品推荐
相关产品推荐

