From f70b9c76001341ee3025332914da47de9adc8f3b Mon Sep 17 00:00:00 2001 From: Sergey G Date: Thu, 22 Feb 2024 16:52:24 +0700 Subject: [PATCH 1/3] Issue 1671: Add MemberNotNullWhen attribute for Content property in IApiResponse interface --- Refit/ApiResponse.cs | 35 ++++++++++++++++++++++++----------- 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/Refit/ApiResponse.cs b/Refit/ApiResponse.cs index cf1ff9d46..1a1abd079 100644 --- a/Refit/ApiResponse.cs +++ b/Refit/ApiResponse.cs @@ -131,18 +131,40 @@ void Dispose(bool disposing) } /// - public interface IApiResponse : IApiResponse + public interface IApiResponse : IApiResponseBase { /// /// Deserialized request content as . /// T? Content { get; } + + /// + /// Indicates whether the request was successful. + /// +#if NET6_0_OR_GREATER + [MemberNotNullWhen(true, nameof(ContentHeaders))] + [MemberNotNullWhen(false, nameof(Error))] + [MemberNotNullWhen(true, nameof(Content))] +#endif + bool IsSuccessStatusCode { get; } + } + + public interface IApiResponse : IApiResponseBase + { + /// + /// Indicates whether the request was successful. + /// +#if NET6_0_OR_GREATER + [MemberNotNullWhen(true, nameof(ContentHeaders))] + [MemberNotNullWhen(false, nameof(Error))] +#endif + bool IsSuccessStatusCode { get; } } /// /// Base interface used to represent an API response. /// - public interface IApiResponse : IDisposable + public interface IApiResponseBase : IDisposable { /// /// HTTP response headers. @@ -154,15 +176,6 @@ public interface IApiResponse : IDisposable /// HttpContentHeaders? ContentHeaders { get; } - /// - /// Indicates whether the request was successful. - /// -#if NET6_0_OR_GREATER - [MemberNotNullWhen(true, nameof(ContentHeaders))] - [MemberNotNullWhen(false, nameof(Error))] -#endif - bool IsSuccessStatusCode { get; } - /// /// HTTP response status code. /// From 614f97255dcb8fcd1713c76f66eee1bcd6bb6b80 Mon Sep 17 00:00:00 2001 From: Serj G Date: Fri, 24 May 2024 14:47:01 +0300 Subject: [PATCH 2/3] Fix missing IApiResponse implementation for ApiResponse class --- Refit/ApiResponse.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Refit/ApiResponse.cs b/Refit/ApiResponse.cs index c6b556123..4c6f2e3af 100644 --- a/Refit/ApiResponse.cs +++ b/Refit/ApiResponse.cs @@ -29,7 +29,7 @@ static class ApiResponse /// Implementation of that provides additional functionalities. /// /// - public sealed class ApiResponse : IApiResponse + public sealed class ApiResponse : IApiResponse, IApiResponse { readonly HttpResponseMessage response; bool disposed; From e27b0a656e660f53342af0dcc1152052adeeb06a Mon Sep 17 00:00:00 2001 From: Chris Pulman Date: Sun, 26 May 2024 18:56:29 +0100 Subject: [PATCH 3/3] Update APIResponse Update APIResponse as MemberNotNullWhen needs to be in same interface as members --- Refit/ApiResponse.cs | 29 ++++++++++++----------------- 1 file changed, 12 insertions(+), 17 deletions(-) diff --git a/Refit/ApiResponse.cs b/Refit/ApiResponse.cs index 4c6f2e3af..0cc851374 100644 --- a/Refit/ApiResponse.cs +++ b/Refit/ApiResponse.cs @@ -60,6 +60,8 @@ public sealed class ApiResponse : IApiResponse, IApiResponse /// public T? Content { get; } + object? IApiResponse.Content => Content; + /// /// Refit settings used to send the request. /// @@ -158,13 +160,19 @@ void Dispose(bool disposing) } /// - public interface IApiResponse : IApiResponseBase + public interface IApiResponse : IApiResponse { /// /// Deserialized request content as . /// - T? Content { get; } + new T? Content { get; } + } + /// + /// Base interface used to represent an API response. + /// + public interface IApiResponse : IDisposable + { /// /// Indicates whether the request was successful. /// @@ -174,25 +182,12 @@ public interface IApiResponse : IApiResponseBase [MemberNotNullWhen(true, nameof(Content))] #endif bool IsSuccessStatusCode { get; } - } - public interface IApiResponse : IApiResponseBase - { /// - /// Indicates whether the request was successful. + /// Deserialized request content as an object. /// -#if NET6_0_OR_GREATER - [MemberNotNullWhen(true, nameof(ContentHeaders))] - [MemberNotNullWhen(false, nameof(Error))] -#endif - bool IsSuccessStatusCode { get; } - } + object? Content { get; } - /// - /// Base interface used to represent an API response. - /// - public interface IApiResponseBase : IDisposable - { /// /// HTTP response headers. ///