Exemple #1
0
        protected internal override Func <object[], object> ToDelegate(OverloadResolver resolver, RestrictedArguments args, bool[] hasBeenUsed)
        {
            if (resolver.GetActualArguments().CollapsedCount > 0)
            {
                return(null);
            }

            var indexes = new List <Func <object[], object> >(_expandedCount);

            for (int i = _start; i < _start + _expandedCount; i++)
            {
                if (!hasBeenUsed[i])
                {
                    indexes.Add(resolver.GetConvertor(i + 1, args.GetObject(i), ParameterInfo, _elementType));
                    hasBeenUsed[i] = true;
                }
            }

            if (_elementType == typeof(object))
            {
                return(new ParamArrayDelegate <object>(indexes.ToArray(), _start).MakeParamsArray);
            }

            Type genType = typeof(ParamArrayDelegate <>).MakeGenericType(_elementType);

            return((Func <object[], object>)Delegate.CreateDelegate(
                       typeof(Func <object[], object>),
                       Activator.CreateInstance(genType, indexes.ToArray(), _start),
                       genType.GetMethod("MakeParamsArray")));
        }
        protected internal override Func <object[], object> ToDelegate(OverloadResolver resolver, RestrictedArguments args, bool[] hasBeenUsed)
        {
            Func <object[], object> conv = resolver.GetConvertor(_index + 1, args.GetObject(_index), ParameterInfo, _parameterType);

            if (conv != null)
            {
                return(conv);
            }

            return((Func <object[], object>)Delegate.CreateDelegate(
                       typeof(Func <object[], object>),
                       _index + 1,
                       typeof(ArgBuilder).GetMethod("ArgumentRead")));
        }
Exemple #3
0
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1045:DoNotPassTypesByReference")] // TODO
        internal protected virtual Func <object[], object> ToDelegate(ref MethodInfo method, OverloadResolver resolver, RestrictedArguments args, bool[] hasBeenUsed)
        {
            if (_index == -1)
            {
                return((_) => null);
            }

            GetCallableMethod(args, ref method);

            Func <object[], object> conv = resolver.GetConvertor(_index + 1, args.GetObject(_index), null, method.DeclaringType);

            if (conv != null)
            {
                return(conv);
            }

            return((Func <object[], object>)Delegate.CreateDelegate(
                       typeof(Func <object[], object>),
                       _index + 1,
                       typeof(ArgBuilder).GetMethod("ArgumentRead")));
        }