如何通过反射获取类中Enum对象并在泛型方法中获取枚举索引
解决枚举类型的动态查询问题
针对你遇到的枚举字段动态查询不生效的问题,核心原因是model传入的枚举名称字符串(如"Brown")和实体中枚举类型的属性无法直接进行相等比较,需要先完成类型转换,以下是具体修改方案:
核心思路
- 识别目标实体(
T)中当前处理的属性是否为枚举类型 - 将model中传入的枚举名称字符串,转换为对应的枚举实例或其底层整数索引
- 构建类型匹配的相等表达式,完成查询条件拼接
修改后的完整代码
public static IQueryable<T> CreateEqualExpressions<T>(IQueryable<T> query, object model) { var result = query; var propertiesToSearch = model.GetType().GetProperties() .Where(x => Attribute.IsDefined(x, typeof(EqualSearchAttribute))) .ToList(); if (propertiesToSearch.Count > 0) { foreach (var propertyInfo in propertiesToSearch) { var propertyValue = propertyInfo.GetValue(model); if (!string.IsNullOrWhiteSpace(propertyValue?.ToString())) { var parameter = Expression.Parameter(typeof(T)); var property = Expression.Property(parameter, propertyInfo.Name); object constantValue = propertyValue; // 处理字符串类型 if (propertyValue is string strValue) { strValue = strValue.Trim(); constantValue = strValue; // 判断目标属性是否为枚举类型 if (property.Type.IsEnum) { // 将字符串转换为对应的枚举实例 var enumValue = Enum.Parse(property.Type, strValue, ignoreCase: true); // 可选:如果需要用整数索引比较,替换为以下代码 // var enumIntValue = (int)Enum.Parse(property.Type, strValue, ignoreCase: true); // constantValue = enumIntValue; // property = Expression.Convert(property, typeof(int)); constantValue = enumValue; } } var constantExp = Expression.Constant(constantValue, property.Type); var equal = Expression.Equal(property, constantExp); var exp = Expression.Lambda<Func<T, bool>>(equal, parameter); result = result.Where(exp); } } } return result; }
关键修改点说明
- 枚举类型判断:通过
property.Type.IsEnum识别当前要查询的实体属性是否为枚举 - 字符串转枚举:使用
Enum.Parse将model传入的枚举名称字符串转换为对应枚举类型的实例,ignoreCase: true支持忽略大小写匹配 - 类型匹配的常量表达式:构建
Expression.Constant时指定目标属性的类型(property.Type),确保表达式两边类型一致 - 可选整数索引查询:如果业务需要用枚举的整数索引(如0、1)进行查询,可将字符串转成枚举后强转为int,同时通过
Expression.Convert将枚举属性转为int类型,再构建相等表达式
这样修改后,既保留了原有的字符串属性处理逻辑,又能正确处理枚举类型的动态查询。
内容的提问来源于stack exchange,提问作者Milad Ahmadi
相关产品推荐
相关产品推荐

