public static AwaitableInfo TryCreate([NotNull] Type type)
        {
            if (type == null)
            {
                throw new ArgumentNullException(nameof(type));
            }

            var runtimeMethods = type.GetRuntimeMethods().ToArray();

            var getAwaiterMethod = runtimeMethods.FirstOrDefault(z =>
                                                                 z.Name == nameof(Task.GetAwaiter) &&
                                                                 z.ReturnType != typeof(void) &&
                                                                 z.GetParameters().Length == 0);

            if (getAwaiterMethod == null)
            {
                return(null);
            }

            var awaiterType = getAwaiterMethod.ReturnType;

            var awaiterInfo = AwaiterInfo.TryCreate(awaiterType.GetTypeInfo());

            if (awaiterInfo == null)
            {
                return(null);
            }

            var info = new AwaitableInfo(type, getAwaiterMethod, awaiterInfo)
            {
                ConfigureAwaitMethod = runtimeMethods.FirstOrDefault(z =>
                                                                     z.Name == nameof(Task.ConfigureAwait) &&
                                                                     z.ReturnType != typeof(void) &&
                                                                     z.GetParameters().Length == 1 &&
                                                                     z.GetParameters()[0].ParameterType == typeof(bool))
            };

            return(info);
        }
Exemplo n.º 2
0
 public TypedAwaitableAdapter(AwaitableInfo info, FunctionInvokerResolver funcResolver)
     : base(info, funcResolver)
 {
     this._awaiterAdapter = new AwaiterAdapterImpl(info.AwaiterInfo, funcResolver);
 }
 protected AwaitableAdapter(AwaitableInfo info)
 {
     this.AwaitableInfo = info ?? throw new ArgumentNullException(nameof(info));
     this._isValueType  = info.AwaitableType.GetTypeInfo().IsValueType;
 }
Exemplo n.º 4
0
 private Lazy <AwaitableInfo> CreateLazy(Type type)
 {
     return(new Lazy <AwaitableInfo>(() => AwaitableInfo.TryCreate(type)));
 }