/// <summary>
        ///
        /// </summary>
        /// <param name="key">The key of the item being resolved.</param>
        /// <returns></returns>
        public TValue this[TKey key]
        {
            get
            {
                // Cache hit?
                TValue value;
                if (ResolvedItems.TryGetValue(key, out value))
                {
                    return(value);
                }

                // Cache miss
                var args = new ResolvableEventArgs <TKey, TValue>(key);

                OnResolve(args);

                if (args.IsResolved)
                {
                    ResolvedItems.Add(args.ResolvingKey, args.ResolvedItem);
                    return(args.ResolvedItem);
                }

                throw new ArgumentOutOfRangeException("key", key, "Unable to resolve");
            }
        }
        private void ReportParameters_Resolve(object sender, ResolvableEventArgs <string, ReportParameter> args)
        {
            // Prompt the consumer first

            var reportParameterElement =
                ReportElement.ReportParameters.First(rp => rp.Name.SafeEqualsIgnoreCase(args.ResolvingKey));

            args.ResolvedItem = LocalReportsEngineCommon.ElementToObject(reportParameterElement, this);
            args.IsResolved   = true;
        }
        private void DataSources_Resolve(object sender, ResolvableEventArgs <string, IResolvedDataSource> args)
        {
            // Prompt the user first

            var dataSourceElement =
                ReportElement.DataSources.First(ds => ds.Name.SafeEqualsIgnoreCase(args.ResolvingKey));

            args.ResolvedItem = LocalReportsEngineCommon.ElementToObject(dataSourceElement, this);
            args.IsResolved   = true;

            // We need to kick off this event, if the ds was resolved while the report was being refreshed
            if (IsReportRefreshing)
            {
                args.ResolvedItem.OnReportRefreshing();
            }
        }
        protected void OnResolve(ResolvableEventArgs <TKey, TValue> args)
        {
            var resolveEvent = Resolve;

            if (resolveEvent == null)
            {
                return;
            }

            foreach (EventHandler <ResolvableEventArgs <TKey, TValue> > invoke in resolveEvent.GetInvocationList())
            {
                invoke(this, args);
                if (args.IsResolved)
                {
                    break;
                }
            }
        }