public void DispatchCallToProvider(object provider, UiaParameterListHelper paramList)
        {
            if (ProviderMethodInfo == null)
            {
                throw new InvalidOperationException("You need to pass providerMethodInfo if you want to call ISchemaMember.DispatchCallToProvider");
            }
            if (paramList.Count != PatternMethodParamDescriptions.Count)
            {
                var message = string.Format("Provided paramList has unexpected number of elements. Expected {0} but was {1}",
                                            PatternMethodParamDescriptions.Count,
                                            paramList.Count);
                throw new ArgumentException(message, "paramList");
            }

            var providerCallParameters = new object[ProviderMethodInfo.GetParameters().Length];

            // fill in params
            for (int i = 0; i < PatternMethodParamDescriptions.Count; i++)
            {
                var desc = PatternMethodParamDescriptions[i];
                if (UiaTypesHelper.IsInType(desc.UiaType))
                {
                    var providerMethodParamIdx = _providerMethodInfoIndicies[desc.Name];
                    providerCallParameters[providerMethodParamIdx] = paramList[i];
                }
            }

            // call provider
            object result = null;

            try
            {
                result = ProviderMethodInfo.Invoke(provider, providerCallParameters);
            }
            catch (TargetInvocationException e)
            {
                if (e.InnerException != null)
                {
                    throw e.InnerException;
                }
                throw;
            }

            // write back out params
            for (int i = 0; i < PatternMethodParamDescriptions.Count; i++)
            {
                var desc = PatternMethodParamDescriptions[i];
                if (desc.Name == UiaTypesHelper.RetParamUnspeakableName)
                {
                    paramList[i] = result;
                    continue;
                }
                if (UiaTypesHelper.IsOutType(desc.UiaType))
                {
                    var providerMethodParamIdx = _providerMethodInfoIndicies[desc.Name];
                    paramList[i] = providerCallParameters[providerMethodParamIdx];
                }
            }
        }
        private UiaMethodInfoHelper(string programmaticName, bool doSetFocus, IEnumerable <UiaParameterDescription> uiaParams, MethodInfo providerMethodInfo)
        {
            _programmaticName   = programmaticName;
            _doSetFocus         = doSetFocus;
            _providerMethodInfo = providerMethodInfo;
            if (ProviderMethodInfo != null)
            {
                _providerMethodInfoIndicies = new Dictionary <string, int>();
                var args = ProviderMethodInfo.GetParameters();
                for (int i = 0; i < args.Length; i++)
                {
                    _providerMethodInfoIndicies.Add(args[i].Name, i);
                }
            }

            PatternMethodParamDescriptions = new List <UiaParameterDescription>();
            foreach (var param in uiaParams)
            {
                AddParameter(param);
            }
        }