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)); }