如何扩展Regex.IsMatch表达式树生成方法以支持嵌套属性
实现支持嵌套属性的Regex表达式树构建方法
原方法仅能处理实体的直接属性,无法解析entity.sub_entity.property这类嵌套属性路径。通过拆分属性路径并逐层构建属性访问表达式,可实现递归动态生成嵌套属性的表达式树,修改后的完整代码如下:
using System; using System.Linq.Expressions; using System.Text.RegularExpressions; public static class ExpressionBuilder { public static Expression<Func<T, bool>> CreateRegExExpression<T>(string pattern, string property) { var paramObject = Expression.Parameter(typeof(T), "e"); Expression currentExpression = paramObject; // 拆分嵌套属性路径 var propertySegments = property.Split('.'); foreach (var segment in propertySegments) { // 逐层构建属性访问表达式 currentExpression = Expression.Property(currentExpression, segment); } var patternConstant = Expression.Constant(pattern, typeof(string)); var isMatchMethod = typeof(Regex).GetMethod("IsMatch", new[] { typeof(string), typeof(string) }); if (isMatchMethod == null || !isMatchMethod.IsStatic) throw new NotSupportedException("无法获取Regex.IsMatch静态方法"); var callExpression = Expression.Call(null, isMatchMethod, currentExpression, patternConstant); return Expression.Lambda<Func<T, bool>>(callExpression, paramObject); } }
关键修改说明
- 拆分属性路径:使用
Split('.')将传入的属性字符串拆分为多个层级的属性名,例如"sub_entity.property"会被拆分为["sub_entity", "property"] - 逐层构建属性访问链:从根参数表达式开始,循环遍历每个属性段,依次调用
Expression.Property生成嵌套的属性访问表达式,最终得到对应嵌套属性的表达式节点 - 简化冗余代码:移除原方法中多余的
Expression.TypeAs调用,因为paramObject本身就是typeof(T)类型的参数表达式
使用示例
假设存在如下实体类:
public class Entity { public SubEntity SubEntity { get; set; } } public class SubEntity { public string Property { get; set; } }
调用方法生成嵌套属性的Regex表达式:
var expression = ExpressionBuilder.CreateRegExExpression<Entity>("^abc.*$", "SubEntity.Property");
该表达式等价于手动编写的:
Expression<Func<Entity, bool>> lambda = e => Regex.IsMatch(e.SubEntity.Property, "^abc.*$");
内容的提问来源于stack exchange,提问作者mtholen
相关产品推荐
相关产品推荐

