Beispiel #1
0
        private static Action <IBindingBuilder>[] ConvertInternal(LambdaExpression expression, IBindingBuilder builder, bool ignoreCallback)
        {
            Expression lastExpression;
            string     path;

            if (BindingExtensions.TryGetMemberPath(expression.Body, ".", false, out lastExpression, out path) &&
                expression.Parameters[0] == lastExpression)
            {
                if (ignoreCallback)
                {
                    builder.GetOrAddBindingSources().Add(context => BindingExtensions.CreateBindingSource(context, path, null));
                    return(Empty.Array <Action <IBindingBuilder> >());
                }
                return(new Action <IBindingBuilder>[] { b => b.GetOrAddBindingSources().Add(context => BindingExtensions.CreateBindingSource(context, path, null)) });
            }
            var visitor = new LambdaExpressionToBindingExpressionConverter(expression);

            visitor.ConvertInternal(expression);
            var actions = visitor._callbacks.ToArray();

            visitor._members           = null;
            visitor._sourceExpression  = null;
            visitor._currentExpression = null;
            visitor._methodExpression  = null;
            visitor._callbacks         = null;
            return(actions);
        }
Beispiel #2
0
        public static Func <IDataContext, object> ConvertParameter(IBindingBuilder builder, Func <LambdaExpression> expression)
        {
            var hasClosure = expression.HasClosure();

            if (hasClosure || builder.Contains(BindingBuilderConstants.NoCache))
            {
                var e = expression();
                if (hasClosure)
                {
                    e.TraceClosureWarn();
                }
                var converter = new LambdaExpressionToBindingExpressionConverter(e);
                return(ConvertParameterInternal(builder, converter.ConvertParamterInternal(e)));
            }
            ParameterCacheValue value;

            lock (CacheParameter)
            {
                if (!CacheParameter.TryGetValue(expression, out value))
                {
                    var e         = expression();
                    var converter = new LambdaExpressionToBindingExpressionConverter(e);
                    value = converter.ConvertParamterInternal(e);
                    CacheParameter[expression] = value;
                }
            }
            return(ConvertParameterInternal(builder, value));
        }