Beispiel #1
0
        private object CastBackToCorrectTaskType(MethodInfo targetMethod, object result)
        {
            var returnType         = targetMethod.GetAsyncReturnType();
            var conversionDelegate = TaskConversionCache.MakeSpecific(returnType);

            return(conversionDelegate((Task <object>)result));
        }
Beispiel #2
0
        public static Func <TInstanceType, object[], Task <object> > BuildAsyncDelegate <TInstanceType>(this MethodInfo mi)
        {
            try
            {
                var returnType = mi.IsVoidAsync() ? typeof(void) : mi.GetAsyncReturnType();

                var parameters = mi.GetParameters();

                var instanceParam = Expression.Parameter(typeof(TInstanceType), "instance");

                var argumentsArray = Expression.Parameter(typeof(object[]), "args");
                var arguments      = GetCallArguments(parameters, instanceParam, argumentsArray).ToArray();

                var call = GetCall(instanceParam, mi, arguments);

                Expression body;

                if (returnType == typeof(void))
                {
                    body = Expression.Call(null, addReturnValueToAsyncVoid, call);
                }
                else
                {
                    var convert = TaskConversionCache.MakeGenericExpression(returnType);
                    body = Expression.Invoke(convert, call);
                }

                var lambda = Expression.Lambda <Func <TInstanceType, object[], Task <object> > >(body, instanceParam, argumentsArray);

                var func = lambda.Compile();
                return(func);
            }
            catch (Exception ex)
            {
                throw new ApplicationException($"Problem compiling wrapper for {mi.Name} defined in {mi.DeclaringType.FullName}", ex);
            }
        }