private static Func <IDataContext, object> ConvertParameterInternal(IBuilderSyntax builder, ParameterCacheValue value)
        {
            var actions = value.Actions;

            for (int i = 0; i < actions.Length; i++)
            {
                actions[i].Invoke((IBindingToSyntax)builder);
            }

            var func    = value.Expression;
            var members = value.Members;
            var sources = new IObserver[members.Length];

            for (int i = 0; i < members.Length; i++)
            {
                sources[i] = members[i].Invoke(builder.Builder);
            }
            return(dataContext =>
            {
                var objects = new object[sources.Length + 1];
                objects[0] = dataContext;
                for (int i = 0; i < sources.Length; i++)
                {
                    objects[i + 1] = sources[i].GetCurrentValue();
                }
                return func(dataContext, objects);
            });
        }
Esempio n. 2
0
        private static IBindingInfoBehaviorSyntax WithBehaviorInternal(this IBuilderSyntax syntax,
                                                                       IBindingBehavior behavior)
        {
            Should.NotBeNull(syntax, "syntax");
            Should.NotBeNull(behavior, "behavior");
            IList <IBindingBehavior> behaviors = syntax.Builder.GetOrAddBehaviors();

            behaviors.Add(behavior);
            return(syntax.Builder.GetOrAddSyntaxBuilder());
        }
 private static TResult GetOrAddSyntaxBuilder<TResult, T1, T2>(this IBuilderSyntax bindingSyntax)
     where T1 : class
     where TResult : IBindingInfoSyntax<T2>
 {
     if (bindingSyntax is TResult)
         return (TResult)bindingSyntax;
     IBindingBuilder builder = bindingSyntax.Builder;
     object syntaxBuilder;
     if (!builder.TryGetData(SyntaxBuilderConstant, out syntaxBuilder) || !(syntaxBuilder is TResult))
     {
         syntaxBuilder = new SyntaxBuilder<T1, T2>(builder);
         builder.AddOrUpdate(SyntaxBuilderConstant, syntaxBuilder);
     }
     return (TResult)syntaxBuilder;
 }
        private static IBindingInfoBehaviorSyntax <TSource> WithParameter <TSource, TValue>(this IBuilderSyntax syntax,
                                                                                            DataConstant <Func <IDataContext, TValue> > constant, Func <LambdaExpression> expression)
        {
            Should.NotBeNull(syntax, "syntax");
            Func <IDataContext, TValue> value;

            if (typeof(TValue) == typeof(object))
            {
                value = (Func <IDataContext, TValue>)(object) LambdaExpressionToBindingExpressionConverter.ConvertParameter(expression, syntax);
            }
            else
            {
                value = LambdaExpressionToBindingExpressionConverter.ConvertParameter(expression, syntax).CastFunc <TValue>;
            }
            syntax.Builder.AddOrUpdate(constant, value);
            return(syntax.GetOrAddSyntaxBuilder <IBindingInfoBehaviorSyntax <TSource>, object, TSource>());
        }
 private static IBindingInfoBehaviorSyntax <TSource> WithBehaviorInternal <TSource>(this IBuilderSyntax syntax,
                                                                                    IBindingBehavior behavior)
 {
     Should.NotBeNull(syntax, "syntax");
     Should.NotBeNull(behavior, "behavior");
     syntax.Builder.GetOrAddBehaviors().Add(behavior);
     return(syntax.GetOrAddSyntaxBuilder <IBindingInfoBehaviorSyntax <TSource>, object, TSource>());
 }
 private static IBindingInfoBehaviorSyntax<TSource> WithParameter<TSource, TValue>(this IBuilderSyntax syntax,
     DataConstant<Func<IDataContext, TValue>> constant, Func<LambdaExpression> expression)
 {
     Should.NotBeNull(syntax, nameof(syntax));
     BindingServiceProvider.BindingProvider.BuildParameterFromLambdaExpression(syntax.Builder, expression, constant);
     return syntax.GetOrAddSyntaxBuilder<IBindingInfoBehaviorSyntax<TSource>, object, TSource>();
 }
        public static Func <IDataContext, object> ConvertParameter(Func <LambdaExpression> expression, IBuilderSyntax syntax)
        {
            Should.NotBeNull(expression, "expression");
            var hasClosure = expression.HasClosure();

            if (hasClosure || syntax.Builder.Contains(BindingBuilderConstants.NoCache))
            {
                var e = expression();
                if (hasClosure)
                {
                    e.TraceClosureWarn();
                }
                var converter = new LambdaExpressionToBindingExpressionConverter(e);
                return(ConvertParameterInternal(syntax, 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(syntax, value));
        }