diff options
author | Stephen Halter <halter73@gmail.com> | 2022-05-17 23:42:32 +0300 |
---|---|---|
committer | Stephen Halter <halter73@gmail.com> | 2022-07-23 00:28:17 +0300 |
commit | ec7e5670617bd8f0e0ec5713fd24190e04d3bb95 (patch) | |
tree | 9d854b1f7f38eac33504bc8fec13bd48934f2429 | |
parent | 6ad8ac45971afd24f705b4cb32b8bd2858a551cc (diff) |
Task and ValueTask are not covarianthalter73/task-is-not-covariant
-rw-r--r-- | src/Http/Http.Extensions/src/RequestDelegateFactory.cs | 40 | ||||
-rw-r--r-- | src/Http/Http.Extensions/test/RequestDelegateFactoryTests.cs | 17 |
2 files changed, 8 insertions, 49 deletions
diff --git a/src/Http/Http.Extensions/src/RequestDelegateFactory.cs b/src/Http/Http.Extensions/src/RequestDelegateFactory.cs index 78213b3375..a51aa4ea5b 100644 --- a/src/Http/Http.Extensions/src/RequestDelegateFactory.cs +++ b/src/Http/Http.Extensions/src/RequestDelegateFactory.cs @@ -46,7 +46,7 @@ public static partial class RequestDelegateFactory private static readonly MethodInfo ExecuteValueTaskOfStringMethod = typeof(RequestDelegateFactory).GetMethod(nameof(ExecuteValueTaskOfString), BindingFlags.NonPublic | BindingFlags.Static)!; private static readonly MethodInfo ExecuteTaskResultOfTMethod = typeof(RequestDelegateFactory).GetMethod(nameof(ExecuteTaskResult), BindingFlags.NonPublic | BindingFlags.Static)!; private static readonly MethodInfo ExecuteValueResultTaskOfTMethod = typeof(RequestDelegateFactory).GetMethod(nameof(ExecuteValueTaskResult), BindingFlags.NonPublic | BindingFlags.Static)!; - private static readonly MethodInfo ExecuteObjectReturnMethod = typeof(RequestDelegateFactory).GetMethod(nameof(ExecuteObjectReturn), BindingFlags.NonPublic | BindingFlags.Static)!; + private static readonly MethodInfo ExecuteAwaitedReturnMethod = typeof(RequestDelegateFactory).GetMethod(nameof(ExecuteAwaitedReturn), BindingFlags.NonPublic | BindingFlags.Static)!; private static readonly MethodInfo GetRequiredServiceMethod = typeof(ServiceProviderServiceExtensions).GetMethod(nameof(ServiceProviderServiceExtensions.GetRequiredService), BindingFlags.Public | BindingFlags.Static, new Type[] { typeof(IServiceProvider) })!; private static readonly MethodInfo GetServiceMethod = typeof(ServiceProviderServiceExtensions).GetMethod(nameof(ServiceProviderServiceExtensions.GetService), BindingFlags.Public | BindingFlags.Static, new Type[] { typeof(IServiceProvider) })!; private static readonly MethodInfo ResultWriteResponseAsyncMethod = typeof(RequestDelegateFactory).GetMethod(nameof(ExecuteResultWriteResponse), BindingFlags.NonPublic | BindingFlags.Static)!; @@ -886,7 +886,7 @@ public static partial class RequestDelegateFactory } else if (returnType == typeof(object)) { - return Expression.Call(ExecuteObjectReturnMethod, methodCall, HttpContextExpr); + return Expression.Call(ExecuteAwaitedReturnMethod, methodCall, HttpContextExpr); } else if (returnType == typeof(ValueTask<object>)) { @@ -1876,12 +1876,12 @@ public static partial class RequestDelegateFactory { static async Task ExecuteAwaited(ValueTask<object> valueTask, HttpContext httpContext) { - await ExecuteObjectReturn(await valueTask, httpContext); + await ExecuteAwaitedReturn(await valueTask, httpContext); } if (valueTask.IsCompletedSuccessfully) { - return ExecuteObjectReturn(valueTask.GetAwaiter().GetResult(), httpContext); + return ExecuteAwaitedReturn(valueTask.GetAwaiter().GetResult(), httpContext); } return ExecuteAwaited(valueTask, httpContext); @@ -1891,45 +1891,21 @@ public static partial class RequestDelegateFactory { static async Task ExecuteAwaited(Task<object> task, HttpContext httpContext) { - await ExecuteObjectReturn(await task, httpContext); + await ExecuteAwaitedReturn(await task, httpContext); } if (task.IsCompletedSuccessfully) { - return ExecuteObjectReturn(task.GetAwaiter().GetResult(), httpContext); + return ExecuteAwaitedReturn(task.GetAwaiter().GetResult(), httpContext); } return ExecuteAwaited(task, httpContext); } - private static Task ExecuteObjectReturn(object obj, HttpContext httpContext) + private static Task ExecuteAwaitedReturn(object obj, HttpContext httpContext) { - if (obj is Task<object> taskObj) - { - return ExecuteTaskOfObject(taskObj, httpContext); - } - else if (obj is ValueTask<object> valueTaskObj) - { - return ExecuteValueTaskOfObject(valueTaskObj, httpContext); - } - else if (obj is Task<IResult?> task) - { - return ExecuteTaskResult(task, httpContext); - } - else if (obj is ValueTask<IResult?> valueTask) - { - return ExecuteValueTaskResult(valueTask, httpContext); - } - else if (obj is Task<string?> taskString) - { - return ExecuteTaskOfString(taskString, httpContext); - } - else if (obj is ValueTask<string?> valueTaskString) - { - return ExecuteValueTaskOfString(valueTaskString, httpContext); - } // Terminal built ins - else if (obj is IResult result) + if (obj is IResult result) { return ExecuteResultWriteResponse(result, httpContext); } diff --git a/src/Http/Http.Extensions/test/RequestDelegateFactoryTests.cs b/src/Http/Http.Extensions/test/RequestDelegateFactoryTests.cs index 6553767887..3e09154dd7 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateFactoryTests.cs +++ b/src/Http/Http.Extensions/test/RequestDelegateFactoryTests.cs @@ -2845,14 +2845,6 @@ public class RequestDelegateFactoryTests : LoggedTest // Object return type where the object is IResult static object StaticResultAsObject() => new CustomResult("Still not enough tests!"); - static object StaticResultAsTaskObject() => Task.FromResult<object>(new CustomResult("Still not enough tests!")); - static object StaticResultAsValueTaskObject() => ValueTask.FromResult<object>(new CustomResult("Still not enough tests!")); - - // Object return type where the object is Task<IResult> - static object StaticResultAsTaskIResult() => Task.FromResult<IResult>(new CustomResult("Still not enough tests!")); - - // Object return type where the object is ValueTask<IResult> - static object StaticResultAsValueTaskIResult() => ValueTask.FromResult<IResult>(new CustomResult("Still not enough tests!")); // Task<object> return type static Task<object> StaticTaskOfIResultAsObject() => Task.FromResult<object>(new CustomResult("Still not enough tests!")); @@ -2872,11 +2864,6 @@ public class RequestDelegateFactoryTests : LoggedTest new object[] { (Func<ValueTask<CustomResult>>)StaticValueTaskTestAction}, new object[] { (Func<object>)StaticResultAsObject}, - new object[] { (Func<object>)StaticResultAsTaskObject}, - new object[] { (Func<object>)StaticResultAsValueTaskObject}, - - new object[] { (Func<object>)StaticResultAsTaskIResult}, - new object[] { (Func<object>)StaticResultAsValueTaskIResult}, new object[] { (Func<Task<object>>)StaticTaskOfIResultAsObject}, new object[] { (Func<ValueTask<object>>)StaticValueTaskOfIResultAsObject}, @@ -2922,8 +2909,6 @@ public class RequestDelegateFactoryTests : LoggedTest // Dynamic via object static object StaticStringAsObjectTestAction() => "String Test"; - static object StaticTaskStringAsObjectTestAction() => Task.FromResult("String Test"); - static object StaticValueTaskStringAsObjectTestAction() => ValueTask.FromResult("String Test"); // Dynamic via Task<object> static Task<object> StaticStringAsTaskObjectTestAction() => Task.FromResult<object>("String Test"); @@ -2941,8 +2926,6 @@ public class RequestDelegateFactoryTests : LoggedTest new object[] { (Func<ValueTask<string>>)StaticValueTaskTestAction }, new object[] { (Func<object>)StaticStringAsObjectTestAction }, - new object[] { (Func<object>)StaticTaskStringAsObjectTestAction }, - new object[] { (Func<object>)StaticValueTaskStringAsObjectTestAction }, new object[] { (Func<Task<object>>)StaticStringAsTaskObjectTestAction }, new object[] { (Func<ValueTask<object>>)StaticStringAsValueTaskObjectTestAction }, |