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)); }
public static void Convert(IBindingBuilder builder, Func <LambdaExpression> expression) { var hasClosure = expression.HasClosure(); if (hasClosure || builder.Contains(BindingBuilderConstants.NoCache)) { var ex = expression(); if (hasClosure) { ex.TraceClosureWarn(); } Convert(builder, ex); return; } Action <IBindingBuilder>[] callbacks; lock (Cache) { if (!Cache.TryGetValue(expression, out callbacks)) { callbacks = ConvertInternal(expression(), builder, false); Cache[expression] = callbacks; } } for (int i = 0; i < callbacks.Length; i++) { callbacks[i].Invoke(builder); } }