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); } }