コード例 #1
0
 private static object CallMethod(Symbols.Container BaseReference, string MethodName, object[] Arguments, string[] ArgumentNames, Type[] TypeArguments, bool[] CopyBack, BindingFlags InvocationFlags, bool ReportErrors, ref OverloadResolution.ResolutionFailure Failure)
 {
     Failure = OverloadResolution.ResolutionFailure.None;
     if ((ArgumentNames.Length > Arguments.Length) || ((CopyBack != null) && (CopyBack.Length != Arguments.Length)))
     {
         Failure = OverloadResolution.ResolutionFailure.InvalidArgument;
         if (ReportErrors)
         {
             throw new ArgumentException(Utils.GetResourceString("Argument_InvalidValue"));
         }
         return null;
     }
     if (Symbols.HasFlag(InvocationFlags, BindingFlags.SetProperty) && (Arguments.Length < 1))
     {
         Failure = OverloadResolution.ResolutionFailure.InvalidArgument;
         if (ReportErrors)
         {
             throw new ArgumentException(Utils.GetResourceString("Argument_InvalidValue"));
         }
         return null;
     }
     MemberInfo[] members = BaseReference.GetMembers(ref MethodName, ReportErrors);
     if ((members == null) || (members.Length == 0))
     {
         Failure = OverloadResolution.ResolutionFailure.MissingMember;
         if (ReportErrors)
         {
             members = BaseReference.GetMembers(ref MethodName, true);
         }
         return null;
     }
     Symbols.Method targetProcedure = ResolveCall(BaseReference, MethodName, members, Arguments, ArgumentNames, TypeArguments, InvocationFlags, ReportErrors, ref Failure);
     if (Failure == OverloadResolution.ResolutionFailure.None)
     {
         return BaseReference.InvokeMethod(targetProcedure, Arguments, CopyBack, InvocationFlags);
     }
     return null;
 }
コード例 #2
0
 internal static Symbols.Method ResolveCall(Symbols.Container BaseReference, string MethodName, MemberInfo[] Members, object[] Arguments, string[] ArgumentNames, Type[] TypeArguments, BindingFlags LookupFlags, bool ReportErrors, ref OverloadResolution.ResolutionFailure Failure)
 {
     Failure = OverloadResolution.ResolutionFailure.None;
     if ((Members[0].MemberType != MemberTypes.Method) && (Members[0].MemberType != MemberTypes.Property))
     {
         Failure = OverloadResolution.ResolutionFailure.InvalidTarget;
         if (ReportErrors)
         {
             throw new ArgumentException(Utils.GetResourceString("ExpressionNotProcedure", new string[] { MethodName, BaseReference.VBFriendlyName }));
         }
         return null;
     }
     int length = Arguments.Length;
     object argument = null;
     if (Symbols.HasFlag(LookupFlags, BindingFlags.SetProperty))
     {
         if (Arguments.Length == 0)
         {
             Failure = OverloadResolution.ResolutionFailure.InvalidArgument;
             if (ReportErrors)
             {
                 throw new InvalidCastException(Utils.GetResourceString("PropertySetMissingArgument1", new string[] { MethodName }));
             }
             return null;
         }
         object[] sourceArray = Arguments;
         Arguments = new object[(length - 2) + 1];
         Array.Copy(sourceArray, Arguments, Arguments.Length);
         argument = sourceArray[length - 1];
     }
     Symbols.Method targetProcedure = OverloadResolution.ResolveOverloadedCall(MethodName, Members, Arguments, ArgumentNames, TypeArguments, LookupFlags, ReportErrors, ref Failure);
     if (Failure != OverloadResolution.ResolutionFailure.None)
     {
         return null;
     }
     if (!targetProcedure.ArgumentsValidated && !OverloadResolution.CanMatchArguments(targetProcedure, Arguments, ArgumentNames, TypeArguments, false, null))
     {
         Failure = OverloadResolution.ResolutionFailure.InvalidArgument;
         if (!ReportErrors)
         {
             return null;
         }
         string str = "";
         List<string> list = new List<string>();
         bool flag = OverloadResolution.CanMatchArguments(targetProcedure, Arguments, ArgumentNames, TypeArguments, false, list);
         foreach (string str2 in list)
         {
             str = str + "\r\n    " + str2;
         }
         throw new InvalidCastException(Utils.GetResourceString("MatchArgumentFailure2", new string[] { targetProcedure.ToString(), str }));
     }
     if (targetProcedure.IsProperty)
     {
         if (MatchesPropertyRequirements(targetProcedure, LookupFlags) == null)
         {
             Failure = OverloadResolution.ResolutionFailure.InvalidTarget;
             if (ReportErrors)
             {
                 throw ReportPropertyMismatch(targetProcedure, LookupFlags);
             }
             return null;
         }
     }
     else if (Symbols.HasFlag(LookupFlags, BindingFlags.SetProperty))
     {
         Failure = OverloadResolution.ResolutionFailure.InvalidTarget;
         if (ReportErrors)
         {
             throw new MissingMemberException(Utils.GetResourceString("MethodAssignment1", new string[] { targetProcedure.AsMethod().Name }));
         }
         return null;
     }
     if (!Symbols.HasFlag(LookupFlags, BindingFlags.SetProperty))
     {
         return targetProcedure;
     }
     ParameterInfo[] parameters = GetCallTarget(targetProcedure, LookupFlags).GetParameters();
     ParameterInfo parameter = parameters[parameters.Length - 1];
     bool requiresNarrowingConversion = false;
     bool allNarrowingIsFromObject = false;
     if (OverloadResolution.CanPassToParameter(targetProcedure, argument, parameter, false, false, null, ref requiresNarrowingConversion, ref allNarrowingIsFromObject))
     {
         return targetProcedure;
     }
     Failure = OverloadResolution.ResolutionFailure.InvalidArgument;
     if (!ReportErrors)
     {
         return null;
     }
     string str3 = "";
     List<string> errors = new List<string>();
     allNarrowingIsFromObject = false;
     requiresNarrowingConversion = false;
     bool flag2 = OverloadResolution.CanPassToParameter(targetProcedure, argument, parameter, false, false, errors, ref allNarrowingIsFromObject, ref requiresNarrowingConversion);
     foreach (string str4 in errors)
     {
         str3 = str3 + "\r\n    " + str4;
     }
     throw new InvalidCastException(Utils.GetResourceString("MatchArgumentFailure2", new string[] { targetProcedure.ToString(), str3 }));
 }
コード例 #3
0
 private static object InternalLateIndexGet(object Instance, object[] Arguments, string[] ArgumentNames, bool ReportErrors, ref OverloadResolution.ResolutionFailure Failure, bool[] CopyBack)
 {
     Failure = OverloadResolution.ResolutionFailure.None;
     if (Arguments == null)
     {
         Arguments = Symbols.NoArguments;
     }
     if (ArgumentNames == null)
     {
         ArgumentNames = Symbols.NoArgumentNames;
     }
     Symbols.Container baseReference = new Symbols.Container(Instance);
     if (baseReference.IsCOMObject)
     {
         return LateBinding.LateIndexGet(Instance, Arguments, ArgumentNames);
     }
     if (!baseReference.IsArray)
     {
         return CallMethod(baseReference, "", Arguments, ArgumentNames, Symbols.NoTypeArguments, CopyBack, BindingFlags.GetProperty | BindingFlags.InvokeMethod, ReportErrors, ref Failure);
     }
     if (ArgumentNames.Length > 0)
     {
         Failure = OverloadResolution.ResolutionFailure.InvalidArgument;
         if (ReportErrors)
         {
             throw new ArgumentException(Utils.GetResourceString("Argument_InvalidNamedArgs"));
         }
         return null;
     }
     ResetCopyback(CopyBack);
     return baseReference.GetArrayValue(Arguments);
 }