예제 #1
0
        public Type GetDelegateType(Type returnType, IEnumerable <Type> parameterTypes)
        {
            ArgumentUtility.CheckNotNull("returnType", returnType);
            ArgumentUtility.CheckNotNull("parameterTypes", parameterTypes);

            var types = parameterTypes.Concat(new[] { returnType }).ToArray();

            return(DelegateHelpers.MakeDelegateType(types));
        }
        public static AsyncLambdaCSharpExpression AsyncLambda(Expression body, IEnumerable <ParameterExpression> parameters)
        {
            ContractUtils.RequiresNotNull(body, nameof(body));

            var parameterList = parameters.ToReadOnly();

            var count = parameterList.Count;
            var types = new Type[count + 1];

            if (count > 0)
            {
                var set = new Set <ParameterExpression>(count);

                for (var i = 0; i < count; i++)
                {
                    var parameter = parameterList[i];

                    ValidateAsyncParameter(parameter);

                    types[i] = parameter.Type;

                    if (set.Contains(parameter))
                    {
                        throw LinqError.DuplicateVariable(parameter);
                    }

                    set.Add(parameter);
                }
            }

            if (body.Type == typeof(void))
            {
                types[count] = typeof(Task); // REVIEW: OK to default to Task?
            }
            else
            {
                types[count] = typeof(Task <>).MakeGenericType(body.Type);
            }

            return(CreateAsyncLambda(DelegateHelpers.MakeDelegateType(types), body, parameterList));
        }