Ejemplo n.º 1
0
        /// <summary>
        /// 将对象属性转换为key-value对
        /// </summary>
        /// <param name="obj">对象</param>
        /// <returns>字典</returns>
        private static Dictionary <string, string> ToMap <T>(T obj)
        {
            Dictionary <string, string> result = new Dictionary <string, string>();
            Type t = typeof(T);

            foreach (PropertyInfo property in t.GetProperties(BindingFlags.Public | BindingFlags.Instance))
            {
                string name = property.Name;
                DynamicExpressionAttribute dynamicExpressionAttribute = CustomAttributeExtension <DynamicExpressionAttribute> .GetCustomAttributeValue(t, property);

                string key = dynamicExpressionAttribute.Name ?? name;
                var    val = property.GetValue(obj);
                string value;
                if (dynamicExpressionAttribute.IsDynamicExpression)
                {
                    if (!string.IsNullOrWhiteSpace(dynamicExpressionAttribute.Operator))
                    {
                        if (dynamicExpressionAttribute.Operator == "yyyy-MM-dd")
                        {
                            if (val != null)
                            {
                                value = Convert.ToDateTime(val).ToString(dynamicExpressionAttribute.Operator);
                            }
                            else
                            {
                                value = null;
                            }
                        }
                        else
                        {
                            value = val?.ToString();
                        }
                    }
                    else
                    {
                        value = val?.ToString();
                    }
                }
                else
                {
                    value = val.SerializeObject();
                }
                if (value != null)
                {
                    result.Add(key, value);
                }
            }
            if (result.Count <= 0)
            {
                var    str     = obj.SerializeObject();
                string pattern = "(\"(?<key>[^,^\"]+)\":\"(?<value>[^:^\"]+)\")|(\"(?<key>[^,^\"]+)\":(?<value>[\\d\\.]+))";
                Regex  regex   = new Regex(pattern);
                var    match   = regex.Matches(str);
                foreach (Match item in match)
                {
                    var key   = item.Groups["key"].ToString();
                    var value = item.Groups["value"].ToString();
                    result.Add(key, value);
                }
            }
            return(result);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 获取动态表达式
        /// </summary>
        /// <typeparam name="TResult">表达式数据类型</typeparam>
        /// <typeparam name="TCondition">表达式条件类型</typeparam>
        /// <param name="data">数据</param>
        /// <param name="condtion">条件</param>
        /// <returns>表达式</returns>
        public static Expression <Func <TResult, bool> > GetDynamicExpression <TResult, TCondition>(this IEnumerable <TResult> data, TCondition condtion)
            where TResult : class
            where TCondition : class
        {
            Type tConditionType = typeof(TCondition);
            Type tResultType    = typeof(TResult);

            Expression          totalExpr = Expression.Constant(true);
            ParameterExpression param     = Expression.Parameter(typeof(TResult), "n");

            foreach (PropertyInfo property in tConditionType.GetProperties())
            {
                string key   = property.Name;
                object value = property.GetValue(condtion);
                if (value != null && value.ToString() != string.Empty)
                {
                    DynamicExpressionAttribute dynamicExpressionAttribute = CustomAttributeExtension <DynamicExpressionAttribute> .GetCustomAttributeValue(tConditionType, property);

                    //等式左边的值
                    string     name = dynamicExpressionAttribute.Name ?? key;
                    Expression left = Expression.Property(param, tResultType.GetProperty(name));
                    //等式右边的值
                    Expression right = Expression.Constant(value);

                    Expression filter;
                    switch (dynamicExpressionAttribute.Operator)
                    {
                    case "!=":
                        filter = Expression.NotEqual(left, right);
                        break;

                    case ">":
                        filter = Expression.GreaterThan(left, right);
                        break;

                    case ">=":
                        filter = Expression.GreaterThanOrEqual(left, right);
                        break;

                    case "<":
                        filter = Expression.LessThan(left, right);
                        break;

                    case "<=":
                        filter = Expression.LessThanOrEqual(left, right);
                        break;

                    case "Contains":
                        filter = Expression.Call(Expression.Property(param, tResultType.GetProperty(name)), typeof(string).GetMethod("Contains", new [] { typeof(string) }), Expression.Constant(value));
                        break;

                    default:
                        filter = Expression.Equal(left, right);
                        break;
                    }
                    totalExpr = Expression.And(filter, totalExpr);
                }
            }
            var predicate = Expression.Lambda(totalExpr, param);
            //var dynamic = (Func<TResult, bool>)predicate.Compile();
            var dynamic = (Expression <Func <TResult, bool> >)predicate;

            return(dynamic);
        }