C# 反射 表达式树 模糊搜索

反射实体T,非datetime字段反射获取表达式树

 

  public static Expression<Func<T, bool>> GetSearchExpression<T>(string SearchString)
        {
            Expression<Func<T, bool>> filter = null;
            if (string.IsNullOrEmpty(SearchString)) return null;

            var left = Expression.Parameter(typeof(T), "m");
            Expression expression = Expression.Constant(false);

            T obj = default(T);
            var type = typeof(T);
            obj = (T)Activator.CreateInstance(type);
            var propertyInfos = type.GetProperties();
            foreach (var propertyInfo in propertyInfos)
            {
                if (propertyInfo.Name.ToLower() == "id" || propertyInfo.PropertyType == typeof(DateTime)) continue;

                Expression tostring = Expression.Call
         (
             Expression.Property(left, typeof(T).GetProperty(propertyInfo.Name).Name),
           typeof(object).GetMethod("ToString"new Type[] { })
         );

                Expression right = Expression.Call
                      (
                          tostring,
                        typeof(string).GetMethod("Contains"new Type[] { typeof(string) }),
                        Expression.Constant(SearchString)
                      );

                expression = Expression.Or(right, expression);
            }
            filter = Expression.Lambda<Func<T, bool>>(expression, new[] { left });
            return filter;
        }
posted @ 2014-02-24 17:13  hot's  阅读(731)  评论(1编辑  收藏  举报