/// <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); }
/// <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); }