public CallAggregationCallDescription GetOrAddCall(string methodName, IEnumerable <object> parameters) { CallAggregationCallDescription result = null; lock (callLocker){ foreach (var item in Calls) { if (item.MethodName == methodName && parameters.SequenceEqual(item.Parameters)) { result = item; break; } } if (result == null) { result = new CallAggregationCallDescription(methodName, parameters); Calls.Add(result); } } return(result); }
private async Task <CallAggregationResult> CallServiceAsync(CallAggregationServiceDescription service, CallAggregationCallDescription call) { #if (!SILVERLIGHT) Stopwatch sw = null; if (call.MeasureDuration) { sw = new Stopwatch(); sw.Start(); } #endif var param1 = Expression.Parameter(typeof(CallAggregationService)); var method = service.ContractType.GetMethod(call.MethodName); var returnType = method.ReturnType.GetGenericArguments().First(); var callServiceMethod = CallServiceMethodInfo.MakeGenericMethod(service.ContractType, returnType); var delegateParam1 = Expression.Parameter(service.ContractType); var callDelegate = Expression.Lambda( Expression.Call( delegateParam1, method, call.Parameters.Select((p, i) => Expression.Constant(p, method.GetParameters()[i].ParameterType)) ), delegateParam1); var body = Expression.Call( param1, callServiceMethod, callDelegate ); var compiled = Expression.Lambda <Func <CallAggregationService, Task <object> > >(body, param1).Compile(); var result = await compiled(this); var aggResult = call.CreateResult(result); #if (!SILVERLIGHT) if (call.MeasureDuration) { sw.Stop(); aggResult.Duration = sw.Elapsed; } #endif return(aggResult); }