protected override Expression VisitScoped(ScopedCallSite callSite, ParameterExpression provider) { var keyExpression = Expression.Constant( callSite.Key, typeof(object)); var resolvedExpression = Expression.Variable(typeof(object), "resolved"); var resolvedServices = GetResolvedServices(provider); var tryGetValueExpression = Expression.Call( resolvedServices, TryGetValueMethodInfo, keyExpression, resolvedExpression); var assignExpression = Expression.Assign( resolvedExpression, VisitCallSite(callSite.ServiceCallSite, provider)); var addValueExpression = Expression.Call( resolvedServices, AddMethodInfo, keyExpression, resolvedExpression); var blockExpression = Expression.Block( typeof(object), new[] { resolvedExpression }, Expression.IfThen( Expression.Not(tryGetValueExpression), Expression.Block(assignExpression, addValueExpression)), resolvedExpression); return(blockExpression); }
protected abstract TResult VisitScoped(ScopedCallSite scopedCallSite, TArgument argument);