public static void LateIndexSetComplex(object Instance, object[] Arguments, string[] ArgumentNames, bool OptimisticSet, bool RValueBase) { if (Arguments == null) { Arguments = Symbols.NoArguments; } if (ArgumentNames == null) { ArgumentNames = Symbols.NoArgumentNames; } Symbols.Container BaseReference = new Symbols.Container(Instance); if (BaseReference.IsArray) { if (ArgumentNames.Length > 0) { throw new ArgumentException(Utils.GetResourceString("Argument_InvalidNamedArgs")); } BaseReference.SetArrayValue(Arguments); } else { if (ArgumentNames.Length > Arguments.Length) { throw new ArgumentException(Utils.GetResourceString("Argument_InvalidValue")); } if (Arguments.Length < 1) { throw new ArgumentException(Utils.GetResourceString("Argument_InvalidValue")); } string MemberName = ""; if (BaseReference.IsCOMObject) { LateBinding.LateIndexSetComplex(Instance, Arguments, ArgumentNames, OptimisticSet, RValueBase); } else { BindingFlags bindingFlags = BindingFlags.SetProperty; MemberInfo[] members = BaseReference.GetMembers(ref MemberName, true); OverloadResolution.ResolutionFailure Failure = OverloadResolution.ResolutionFailure.None; Symbols.Method TargetProcedure = NewLateBinding.ResolveCall(BaseReference, MemberName, members, Arguments, ArgumentNames, Symbols.NoTypeArguments, bindingFlags, false, ref Failure); if (Failure == OverloadResolution.ResolutionFailure.None) { if (RValueBase && BaseReference.IsValueType) { throw new Exception(Utils.GetResourceString("RValueBaseForValueType", BaseReference.VBFriendlyName, BaseReference.VBFriendlyName)); } BaseReference.InvokeMethod(TargetProcedure, Arguments, (bool[])null, bindingFlags); } else if (!OptimisticSet) { NewLateBinding.ResolveCall(BaseReference, MemberName, members, Arguments, ArgumentNames, Symbols.NoTypeArguments, bindingFlags, true, ref Failure); throw new InternalErrorException(); } } } }
public void LateIndexSetComplex(object obj, object[] args, string[] paramNames, bool missing, bool valueType) { if (missing) { Assert.Throws <MissingMemberException>(() => LateBinding.LateIndexSetComplex(obj, args, paramNames, false, false)); Assert.Throws <MissingMemberException>(() => LateBinding.LateIndexSetComplex(obj, args, paramNames, false, true)); LateBinding.LateIndexSetComplex(obj, args, paramNames, true, false); LateBinding.LateIndexSetComplex(obj, args, paramNames, true, true); } else if (valueType) { LateBinding.LateIndexSetComplex(obj, args, paramNames, false, false); Assert.Throws <Exception>(() => LateBinding.LateIndexSetComplex(obj, args, paramNames, false, true)); LateBinding.LateIndexSetComplex(obj, args, paramNames, true, false); Assert.Throws <Exception>(() => LateBinding.LateIndexSetComplex(obj, args, paramNames, true, true)); } else { LateBinding.LateIndexSetComplex(obj, args, paramNames, false, false); LateBinding.LateIndexSetComplex(obj, args, paramNames, false, true); LateBinding.LateIndexSetComplex(obj, args, paramNames, true, false); LateBinding.LateIndexSetComplex(obj, args, paramNames, true, true); } }