public static object GetValue(this MemberBinding binding) { switch (binding.BindingType) { case MemberBindingType.Assignment: var assign = (MemberAssignment)binding; var constant = assign.Expression as ConstantExpression; if (constant != null) { return(constant.Value); } try { return(CachedExpressionCompiler.Evaluate(assign.Expression)); } catch (Exception ex) { Log.Error("Error compiling expression in MemberBinding.GetValue()", ex); //Fallback to compile and execute var member = Expression.Convert(assign.Expression, typeof(object)); var lambda = Expression.Lambda <Func <object> >(member); var getter = lambda.Compile(); return(getter()); } } return(null); }
public static string[] GetFieldNames <T>(this Expression <Func <T, object> > expr) { if (expr.Body is MemberExpression member) { if (member.Member.DeclaringType.IsAssignableFrom(typeof(T))) { return new[] { member.Member.Name } } ; var array = CachedExpressionCompiler.Evaluate(member); if (array is IEnumerable <string> strEnum) { return(strEnum.ToArray()); } } if (expr.Body is NewExpression newExpr) { return(newExpr.Arguments.OfType <MemberExpression>().Select(x => x.Member.Name).ToArray()); } if (expr.Body is MemberInitExpression init) { return(init.Bindings.Select(x => x.Member.Name).ToArray()); } if (expr.Body is NewArrayExpression newArray) { var constantExprs = newArray.Expressions.OfType <ConstantExpression>().ToList(); if (newArray.Expressions.Count == constantExprs.Count) { return(constantExprs.Select(x => x.Value.ToString()).ToArray()); } var array = CachedExpressionCompiler.Evaluate(newArray); if (array is string[] strArray) { return(strArray); } return(array.ConvertTo <string[]>()); } if (expr.Body is UnaryExpression unary) { member = unary.Operand as MemberExpression; if (member != null) { return new[] { member.Member.Name } } ; } throw new ArgumentException("Invalid Fields List Expression: " + expr); }