private object CastBackToCorrectTaskType(MethodInfo targetMethod, object result) { var returnType = targetMethod.GetAsyncReturnType(); var conversionDelegate = TaskConversionCache.MakeSpecific(returnType); return(conversionDelegate((Task <object>)result)); }
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); } }