public override DynamicMetaObject FallbackInvokeMember(DynamicMetaObject target, DynamicMetaObject[] args, DynamicMetaObject errorSuggestion) { if (target == null) { throw new ArgumentNullException(nameof(target)); } if (args == null) { throw new ArgumentNullException(nameof(args)); } if (!target.HasValue || args.Any(x => !x.HasValue)) { return(Defer(target, args)); } if (target == null) { return(BinderHelper.NullTargetResult(target, errorSuggestion)); } // If an argument has a null value, use a null type so that the resolution algorithm can do implicit null conversions var argTypes = args.Select(x => x.Value == null ? null : x.RuntimeType).ToImmutableList(); OverloadResolutionData <MethodInfo> method = _methodResolver.ResolveMethod(target.LimitType.GetTypeInfo(), Name, argTypes); var restrictions = BinderHelper.CreateCommonRestrictions(target, args); if (method == null) { var log = BindingEventSource.Log; if (log.IsEnabled()) { var argTypeString = string.Join(",", argTypes.Select(x => x.FullName).ToArray()); log.InvokeMemberResolutionFailure(Name, target.LimitType.FullName, argTypeString); } return(BinderHelper.UnresolveableResult(restrictions, errorSuggestion)); } var methodExpression = _methodResolver.ConvertMethodParameters(method, target.Expression, args); return(new DynamicMetaObject( VelocityExpressions.ConvertIfNeeded(methodExpression, ReturnType), restrictions )); }
private BetterResult IsBetterFunctionMember(string leftName, string rightName, params Type[] args) { var left = typeof(TestMethods).GetMethod(leftName); var right = typeof(TestMethods).GetMethod(rightName); var leftCandidate = new OverloadResolutionData <MethodBase>( leftName.Contains("Params") ? ApplicableForm.Expanded : ApplicableForm.Normal, new FunctionMemberData <MethodBase>(left, left.GetParameters()) ); var rightCandidate = new OverloadResolutionData <MethodBase>( rightName.Contains("Params") ? ApplicableForm.Expanded : ApplicableForm.Normal, new FunctionMemberData <MethodBase>(right, right.GetParameters()) ); return(_overloadResolver.IsBetterFunctionMember(args.ToImmutableList(), leftCandidate, rightCandidate)); }