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); }
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; }
private Lazy <AwaitableInfo> CreateLazy(Type type) { return(new Lazy <AwaitableInfo>(() => AwaitableInfo.TryCreate(type))); }