You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过反射获取类中Enum对象并在泛型方法中获取枚举索引

解决枚举类型的动态查询问题

针对你遇到的枚举字段动态查询不生效的问题,核心原因是model传入的枚举名称字符串(如"Brown")和实体中枚举类型的属性无法直接进行相等比较,需要先完成类型转换,以下是具体修改方案:

核心思路

  1. 识别目标实体(T)中当前处理的属性是否为枚举类型
  2. 将model中传入的枚举名称字符串,转换为对应的枚举实例或其底层整数索引
  3. 构建类型匹配的相等表达式,完成查询条件拼接

修改后的完整代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 17:01:19