From 3943d364544c30564d15eb691367f09ee561b692 Mon Sep 17 00:00:00 2001 From: Jan Steffen Date: Fri, 13 Jul 2018 11:09:51 +0200 Subject: [PATCH 01/12] #176: Adding support for aggregated/interhited interfaces --- .../InterfaceStubGenerator.cs | 16 +++++++- Refit.Tests/InheritedInterfacesApi.cs | 27 +++++++++++++ Refit.Tests/InterfaceStubGenerator.cs | 38 ++++++++++++++++--- 3 files changed, 75 insertions(+), 6 deletions(-) create mode 100644 Refit.Tests/InheritedInterfacesApi.cs diff --git a/InterfaceStubGenerator.Core/InterfaceStubGenerator.cs b/InterfaceStubGenerator.Core/InterfaceStubGenerator.cs index 159e7bb13..8d39661c0 100644 --- a/InterfaceStubGenerator.Core/InterfaceStubGenerator.cs +++ b/InterfaceStubGenerator.Core/InterfaceStubGenerator.cs @@ -4,7 +4,6 @@ using System.Linq; using System.Reflection; using System.Text; -using System.Threading.Tasks; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; @@ -83,6 +82,7 @@ public ClassTemplateInfo GenerateClassInfoForInterface(InterfaceDeclarationSynta ret.InterfaceName = GetInterfaceName(interfaceTree.Identifier); ret.GeneratedClassSuffix = ret.InterfaceName.Replace(".", ""); ret.Modifiers = interfaceTree.Modifiers.Select(t => t.ValueText).FirstOrDefault(m => m == "public" || m == "internal"); + ret.BaseClassNames = interfaceTree.BaseList?.Types.Select(t => t.ToString()).ToList(); if (interfaceTree.TypeParameterList != null) { @@ -168,6 +168,19 @@ public TemplateInformation GenerateTemplateInfoForInterfaceList(List c.BaseClassNames != null && c.BaseClassNames.Any())) + { + var methodsToAdd = ret.ClassList.Where(oc => c.BaseClassNames.Contains(oc.InterfaceName)).SelectMany(oc => oc.MethodList); + c.MethodList.AddRange(methodsToAdd); + } + return ret; } @@ -227,6 +240,7 @@ public class ClassTemplateInfo public string ConstraintClauses { get; set; } public string GeneratedClassSuffix { get; set; } public string InterfaceName { get; set; } + public List BaseClassNames { get; set; } public List MethodList { get; set; } public string Modifiers { get; set; } public string Namespace { get; set; } diff --git a/Refit.Tests/InheritedInterfacesApi.cs b/Refit.Tests/InheritedInterfacesApi.cs new file mode 100644 index 000000000..050830684 --- /dev/null +++ b/Refit.Tests/InheritedInterfacesApi.cs @@ -0,0 +1,27 @@ +using System.Threading.Tasks; +using Refit; // InterfaceStubGenerator looks for this +using static System.Math; // This is here to verify https://github.com/paulcbetts/refit/issues/283 + +namespace Refit.Tests +{ + [Headers("User-Agent: Refit Integration Tests")] + public interface IAmInterfaceA + { + [Get("/ping")] + Task Ping(); + } + + [Headers("User-Agent: Refit Integration Tests")] + public interface IAmInterfaceB + { + [Get("/pong")] + Task Pong(); + } + + [Headers("User-Agent: Refit Integration Tests")] + public interface IAmInterfaceC : IAmInterfaceB, IAmInterfaceA + { + [Get("/pang")] + Task Pang(); + } +} diff --git a/Refit.Tests/InterfaceStubGenerator.cs b/Refit.Tests/InterfaceStubGenerator.cs index 80f36b291..c4f02c794 100644 --- a/Refit.Tests/InterfaceStubGenerator.cs +++ b/Refit.Tests/InterfaceStubGenerator.cs @@ -27,9 +27,11 @@ public void GenerateInterfaceStubsSmokeTest() var result = fixture.GenerateInterfaceStubs(new[] { IntegrationTestHelper.GetPath("RestService.cs"), IntegrationTestHelper.GetPath("GitHubApi.cs"), + IntegrationTestHelper.GetPath("InheritedInterfacesApi.cs"), }); Assert.Contains("IGitHubApi", result); + Assert.Contains("IAmInterfaceC", result); } [Fact] @@ -92,7 +94,7 @@ public void GenerateClassInfoForInterfaceSmokeTest() Assert.Equal("IGitHubApi", result.InterfaceName); Assert.Equal("IGitHubApi", result.GeneratedClassSuffix); } - + [Fact] public void GenerateClassInfoForNestedInterfaceSmokeTest() { @@ -104,14 +106,14 @@ public void GenerateClassInfoForNestedInterfaceSmokeTest() .First(x => x.Identifier.ValueText == "INestedGitHubApi"); var result = fixture.GenerateClassInfoForInterface(input); - - Assert.Equal("TestNested.INestedGitHubApi",result.InterfaceName); - Assert.Equal("TestNestedINestedGitHubApi",result.GeneratedClassSuffix); + + Assert.Equal("TestNested.INestedGitHubApi", result.InterfaceName); + Assert.Equal("TestNestedINestedGitHubApi", result.GeneratedClassSuffix); Assert.Equal(8, result.MethodList.Count); Assert.Equal("GetUser", result.MethodList[0].Name); Assert.Equal("string userName", result.MethodList[0].ArgumentListWithTypes); } - + [Fact] public void GenerateTemplateInfoForInterfaceListSmokeTest() { @@ -126,6 +128,32 @@ public void GenerateTemplateInfoForInterfaceListSmokeTest() Assert.Equal(10, result.ClassList.Count); } + [Fact] + public void GenerateTemplateInfoForInheritedInterfacesListSmokeTest() + { + var file = CSharpSyntaxTree.ParseText(File.ReadAllText(IntegrationTestHelper.GetPath("InheritedInterfacesApi.cs"))); + var fixture = new InterfaceStubGenerator(); + + var input = file.GetRoot().DescendantNodes() + .OfType() + .ToList(); + + var result = fixture.GenerateTemplateInfoForInterfaceList(input); + Assert.Equal(3, result.ClassList.Count); + + var inherited = result.ClassList.First(c => c.InterfaceName == "IAmInterfaceC"); + + Assert.Equal(3, inherited.MethodList.Count); + var methodNames = inherited.MethodList.Select(m => m.Name).ToList(); + + Assert.Contains("Ping", methodNames); + Assert.Contains("Pong", methodNames); + Assert.Contains("Pang", methodNames); + + Assert.Equal("IAmInterfaceC", inherited.InterfaceName); + Assert.Equal("IAmInterfaceC", inherited.GeneratedClassSuffix); + } + [Fact] public void RetainsAliasesInUsings() { From fc801edfb75cb95c84d58a47b87195cfca630740 Mon Sep 17 00:00:00 2001 From: Jan Steffen Date: Wed, 18 Jul 2018 12:09:36 +0200 Subject: [PATCH 02/12] Fixing method AddInheritedMethods unnecessarily returning modified TemplateInformation object --- InterfaceStubGenerator.Core/InterfaceStubGenerator.cs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/InterfaceStubGenerator.Core/InterfaceStubGenerator.cs b/InterfaceStubGenerator.Core/InterfaceStubGenerator.cs index 8d39661c0..71a17d1bf 100644 --- a/InterfaceStubGenerator.Core/InterfaceStubGenerator.cs +++ b/InterfaceStubGenerator.Core/InterfaceStubGenerator.cs @@ -168,20 +168,18 @@ public TemplateInformation GenerateTemplateInfoForInterfaceList(List c.BaseClassNames != null && c.BaseClassNames.Any())) { var methodsToAdd = ret.ClassList.Where(oc => c.BaseClassNames.Contains(oc.InterfaceName)).SelectMany(oc => oc.MethodList); c.MethodList.AddRange(methodsToAdd); } - - return ret; } public void GenerateWarnings(List interfacesToGenerate) From ab8dca520eedc9c1c71977e456b8ffb704fcec13 Mon Sep 17 00:00:00 2001 From: Jan Steffen Date: Wed, 18 Jul 2018 12:53:36 +0200 Subject: [PATCH 03/12] Change generic RequestBuilderImplementation to include inherited methods by it's interfaces --- Refit/RequestBuilderImplementation.cs | 29 ++++++++++++++++++--------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/Refit/RequestBuilderImplementation.cs b/Refit/RequestBuilderImplementation.cs index 4b145ecba..5ee4cef29 100644 --- a/Refit/RequestBuilderImplementation.cs +++ b/Refit/RequestBuilderImplementation.cs @@ -32,6 +32,7 @@ partial class RequestBuilderImplementation : IRequestBuilder public RequestBuilderImplementation(RefitSettings refitSettings = null) { Type targetInterface = typeof(TApi); + Type[] targetInterfaceInheritedInterfaces = targetInterface.GetInterfaces(); settings = refitSettings ?? new RefitSettings(); serializer = JsonSerializer.Create(settings.JsonSerializerSettings); @@ -43,24 +44,32 @@ public RequestBuilderImplementation(RefitSettings refitSettings = null) } TargetType = targetInterface; + var dict = new Dictionary>(); - foreach (var methodInfo in targetInterface.GetMethods()) + AddInterfaceHttpMethods(targetInterface, dict); + foreach (var inheritedInterface in targetInterfaceInheritedInterfaces) { + AddInterfaceHttpMethods(inheritedInterface, dict); + } + + interfaceHttpMethods = dict; + } + + private void AddInterfaceHttpMethods(Type interfaceType, Dictionary> methods) + { + foreach (var methodInfo in interfaceType.GetMethods()) { var attrs = methodInfo.GetCustomAttributes(true); var hasHttpMethod = attrs.OfType().Any(); - if (hasHttpMethod) - { - if (!dict.ContainsKey(methodInfo.Name)) - { - dict.Add(methodInfo.Name, new List()); + if (hasHttpMethod) { + if (!methods.ContainsKey(methodInfo.Name)) { + methods.Add(methodInfo.Name, new List()); } - var restinfo = new RestMethodInfo(targetInterface, methodInfo, settings); - dict[methodInfo.Name].Add(restinfo); + + var restinfo = new RestMethodInfo(interfaceType, methodInfo, settings); + methods[methodInfo.Name].Add(restinfo); } } - - interfaceHttpMethods = dict; } RestMethodInfo FindMatchingRestMethodInfo(string key, Type[] parameterTypes, Type[] genericArgumentTypes) From 44d24d1afbf90ebd3f746de72a44d13331b05342 Mon Sep 17 00:00:00 2001 From: Jan Steffen Date: Wed, 18 Jul 2018 12:54:09 +0200 Subject: [PATCH 04/12] Adjust example inheritance interfaces for integrations tests --- Refit.Tests/InheritedInterfacesApi.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Refit.Tests/InheritedInterfacesApi.cs b/Refit.Tests/InheritedInterfacesApi.cs index 050830684..24a7c46b2 100644 --- a/Refit.Tests/InheritedInterfacesApi.cs +++ b/Refit.Tests/InheritedInterfacesApi.cs @@ -7,21 +7,21 @@ namespace Refit.Tests [Headers("User-Agent: Refit Integration Tests")] public interface IAmInterfaceA { - [Get("/ping")] + [Get("/get?result=Ping")] Task Ping(); } [Headers("User-Agent: Refit Integration Tests")] public interface IAmInterfaceB { - [Get("/pong")] + [Get("/get?result=Pong")] Task Pong(); } [Headers("User-Agent: Refit Integration Tests")] public interface IAmInterfaceC : IAmInterfaceB, IAmInterfaceA { - [Get("/pang")] + [Get("/get?result=Pang")] Task Pang(); } } From 6330b580b487eef6d35fbb62cbf7b2ae411da113 Mon Sep 17 00:00:00 2001 From: Jan Steffen Date: Wed, 18 Jul 2018 12:54:34 +0200 Subject: [PATCH 05/12] Add mock InheritedMethodTest --- Refit.Tests/RestService.cs | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/Refit.Tests/RestService.cs b/Refit.Tests/RestService.cs index 679069bee..b89aa4e7c 100644 --- a/Refit.Tests/RestService.cs +++ b/Refit.Tests/RestService.cs @@ -975,6 +975,36 @@ public async Task GenericMethodTest() mockHttp.VerifyNoOutstandingExpectation(); } + [Fact] + public async Task InheritedMethodTest() + { + var mockHttp = new MockHttpMessageHandler(); + + var settings = new RefitSettings + { + HttpMessageHandlerFactory = () => mockHttp + }; + + var fixture = RestService.For("https://httpbin.org", settings); + + mockHttp.Expect(HttpMethod.Get, "https://httpbin.org/get").Respond("application/json", nameof(IAmInterfaceA.Ping)); + var resp = await fixture.Ping(); + Assert.Equal(nameof(IAmInterfaceA.Ping), resp); + mockHttp.VerifyNoOutstandingExpectation(); + + mockHttp.Expect(HttpMethod.Get, "https://httpbin.org/get") + .Respond("application/json", nameof(IAmInterfaceB.Pong)); + resp = await fixture.Pong(); + Assert.Equal(nameof(IAmInterfaceB.Pong), resp); + mockHttp.VerifyNoOutstandingExpectation(); + + mockHttp.Expect(HttpMethod.Get, "https://httpbin.org/get") + .Respond("application/json", nameof(IAmInterfaceC.Pang)); + resp = await fixture.Pang(); + Assert.Equal(nameof(IAmInterfaceC.Pang), resp); + mockHttp.VerifyNoOutstandingExpectation(); + } + [Fact] public async Task DictionaryDynamicQueryparametersTest() { From 01dee3941ad1f4057dd4716722d230d3a8dfd360 Mon Sep 17 00:00:00 2001 From: "whitesource-bolt-for-github[bot]" Date: Thu, 6 Dec 2018 08:21:02 +0000 Subject: [PATCH 06/12] Initial WhiteSource configuration file --- .whitesource | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 .whitesource diff --git a/.whitesource b/.whitesource new file mode 100644 index 000000000..5ef5902b9 --- /dev/null +++ b/.whitesource @@ -0,0 +1,8 @@ +########################################################## +#### WhiteSource "Bolt for Github" configuration file #### +########################################################## + +# Configuration # +#---------------# +ws.repo.scan=true +vulnerable.check.run.conclusion.level=success \ No newline at end of file From 94a37fde48c8a771bb20dd206a2221eef2b2145d Mon Sep 17 00:00:00 2001 From: Sergio Pedri Date: Thu, 7 Mar 2019 17:19:39 +0100 Subject: [PATCH 07/12] Fixed formatting --- Refit/RequestBuilderImplementation.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Refit/RequestBuilderImplementation.cs b/Refit/RequestBuilderImplementation.cs index 9eeb52984..13244dd41 100644 --- a/Refit/RequestBuilderImplementation.cs +++ b/Refit/RequestBuilderImplementation.cs @@ -61,7 +61,8 @@ private void AddInterfaceHttpMethods(Type interfaceType, Dictionary().Any(); if (hasHttpMethod) { - if (!methods.ContainsKey(methodInfo.Name)) { + if (!methods.ContainsKey(methodInfo.Name)) + { methods.Add(methodInfo.Name, new List()); } From d74278e4ad23700914a695c00b143a9808ac8620 Mon Sep 17 00:00:00 2001 From: Sergio Pedri Date: Thu, 7 Mar 2019 17:22:15 +0100 Subject: [PATCH 08/12] Switched to explicit interface implementation --- .../GeneratedInterfaceStubTemplate.mustache | 5 +- .../InterfaceStubGenerator.cs | 6 +- Refit.Tests/RefitStubs.Net46.cs | 271 ++++++++++++------ Refit.Tests/RefitStubs.NetCore2.cs | 271 ++++++++++++------ 4 files changed, 383 insertions(+), 170 deletions(-) diff --git a/InterfaceStubGenerator.Core/GeneratedInterfaceStubTemplate.mustache b/InterfaceStubGenerator.Core/GeneratedInterfaceStubTemplate.mustache index dfe60d082..0534b9c94 100644 --- a/InterfaceStubGenerator.Core/GeneratedInterfaceStubTemplate.mustache +++ b/InterfaceStubGenerator.Core/GeneratedInterfaceStubTemplate.mustache @@ -61,10 +61,7 @@ namespace {{Namespace}} {{#MethodList}} /// - public virtual {{ReturnType}} {{Name}}{{#MethodTypeParameters}}<{{.}}>{{/MethodTypeParameters}}({{ArgumentListWithTypes}}) - {{#MethodConstraintClauses}} - {{.}} - {{/MethodConstraintClauses}} + {{ReturnType}} {{InterfaceName}}{{#TypeParameters}}<{{.}}>{{/TypeParameters}}.{{Name}}{{#MethodTypeParameters}}<{{.}}>{{/MethodTypeParameters}}({{ArgumentListWithTypes}}) { {{#IsRefitMethod}} var arguments = new object[] { {{ArgumentList}} }; diff --git a/InterfaceStubGenerator.Core/InterfaceStubGenerator.cs b/InterfaceStubGenerator.Core/InterfaceStubGenerator.cs index d09853f11..c9c31c2b3 100644 --- a/InterfaceStubGenerator.Core/InterfaceStubGenerator.cs +++ b/InterfaceStubGenerator.Core/InterfaceStubGenerator.cs @@ -114,6 +114,8 @@ public ClassTemplateInfo GenerateClassInfoForInterface(InterfaceDeclarationSynta var mti = new MethodTemplateInfo { Name = x.Identifier.Text, + InterfaceName = ret.InterfaceName, + TypeParameters = ret.TypeParameters, ReturnType = x.ReturnType.ToString(), ArgumentList = string.Join(",", x.ParameterList.Parameters @@ -134,7 +136,6 @@ public ClassTemplateInfo GenerateClassInfoForInterface(InterfaceDeclarationSynta mti.MethodTypeParameterList = string.Join(", ", typeParameters.Select(p => $"typeof({p.Identifier.ValueText})")); mti.MethodTypeParameterNames = $"{string.Join(", ", typeParameters.Select(p => $"{{typeof({p.Identifier.ValueText}).AssemblyQualifiedName}}"))}"; } - mti.MethodConstraintClauses = x.ConstraintClauses.ToFullString().Trim(); } return mti; }) @@ -267,9 +268,10 @@ public class MethodTemplateInfo public string Name { get; set; } public string ReturnType { get; set; } public string MethodTypeParameters { get; set; } - public string MethodConstraintClauses { get; set; } public string MethodTypeParameterList { get; set; } public string MethodTypeParameterNames { get; set; } + public string InterfaceName { get; set; } + public string TypeParameters { get; set; } } public class TemplateInformation diff --git a/Refit.Tests/RefitStubs.Net46.cs b/Refit.Tests/RefitStubs.Net46.cs index 37823779c..c9c1f7bc6 100644 --- a/Refit.Tests/RefitStubs.Net46.cs +++ b/Refit.Tests/RefitStubs.Net46.cs @@ -73,7 +73,7 @@ public AutoGeneratedIAmARefitInterfaceButNobodyUsesMe(HttpClient client, IReques } /// - public virtual Task RefitMethod() + Task IAmARefitInterfaceButNobodyUsesMe.RefitMethod() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("RefitMethod", new Type[] { }); @@ -81,7 +81,7 @@ public virtual Task RefitMethod() } /// - public virtual Task AnotherRefitMethod() + Task IAmARefitInterfaceButNobodyUsesMe.AnotherRefitMethod() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("AnotherRefitMethod", new Type[] { }); @@ -89,13 +89,13 @@ public virtual Task AnotherRefitMethod() } /// - public virtual Task NoConstantsAllowed() + Task IAmARefitInterfaceButNobodyUsesMe.NoConstantsAllowed() { throw new NotImplementedException("Either this method has no Refit HTTP method attribute or you've used something other than a string literal for the 'path' argument."); } /// - public virtual Task SpacesShouldntBreakMe() + Task IAmARefitInterfaceButNobodyUsesMe.SpacesShouldntBreakMe() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("SpacesShouldntBreakMe", new Type[] { }); @@ -103,7 +103,7 @@ public virtual Task SpacesShouldntBreakMe() } /// - public virtual Task ReservedWordsForParameterNames(int @int,string @string,float @long) + Task IAmARefitInterfaceButNobodyUsesMe.ReservedWordsForParameterNames(int @int,string @string,float @long) { var arguments = new object[] { @int,@string,@long }; var func = requestBuilder.BuildRestResultFuncForMethod("ReservedWordsForParameterNames", new Type[] { typeof(int),typeof(string),typeof(float) }); @@ -134,7 +134,7 @@ public AutoGeneratedIAmHalfRefit(HttpClient client, IRequestBuilder requestBuild } /// - public virtual Task Post() + Task IAmHalfRefit.Post() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("Post", new Type[] { }); @@ -142,7 +142,7 @@ public virtual Task Post() } /// - public virtual Task Get() + Task IAmHalfRefit.Get() { throw new NotImplementedException("Either this method has no Refit HTTP method attribute or you've used something other than a string literal for the 'path' argument."); } @@ -150,6 +150,115 @@ public virtual Task Get() } } +namespace Refit.Tests +{ + using Refit.Tests.RefitInternalGenerated; + + /// + [ExcludeFromCodeCoverage] + [DebuggerNonUserCode] + [Preserve] + partial class AutoGeneratedIAmInterfaceA : IAmInterfaceA { + /// + public HttpClient Client { get; protected set; } + readonly IRequestBuilder requestBuilder; + + /// + public AutoGeneratedIAmInterfaceA(HttpClient client, IRequestBuilder requestBuilder) + { + Client = client; + this.requestBuilder = requestBuilder; + } + + /// + Task IAmInterfaceA.Ping() + { + var arguments = new object[] { }; + var func = requestBuilder.BuildRestResultFuncForMethod("Ping", new Type[] { }); + return (Task)func(Client, arguments); + } + + } +} + +namespace Refit.Tests +{ + using Refit.Tests.RefitInternalGenerated; + + /// + [ExcludeFromCodeCoverage] + [DebuggerNonUserCode] + [Preserve] + partial class AutoGeneratedIAmInterfaceB : IAmInterfaceB { + /// + public HttpClient Client { get; protected set; } + readonly IRequestBuilder requestBuilder; + + /// + public AutoGeneratedIAmInterfaceB(HttpClient client, IRequestBuilder requestBuilder) + { + Client = client; + this.requestBuilder = requestBuilder; + } + + /// + Task IAmInterfaceB.Pong() + { + var arguments = new object[] { }; + var func = requestBuilder.BuildRestResultFuncForMethod("Pong", new Type[] { }); + return (Task)func(Client, arguments); + } + + } +} + +namespace Refit.Tests +{ + using Refit.Tests.RefitInternalGenerated; + + /// + [ExcludeFromCodeCoverage] + [DebuggerNonUserCode] + [Preserve] + partial class AutoGeneratedIAmInterfaceC : IAmInterfaceC { + /// + public HttpClient Client { get; protected set; } + readonly IRequestBuilder requestBuilder; + + /// + public AutoGeneratedIAmInterfaceC(HttpClient client, IRequestBuilder requestBuilder) + { + Client = client; + this.requestBuilder = requestBuilder; + } + + /// + Task IAmInterfaceC.Pang() + { + var arguments = new object[] { }; + var func = requestBuilder.BuildRestResultFuncForMethod("Pang", new Type[] { }); + return (Task)func(Client, arguments); + } + + /// + Task IAmInterfaceA.Ping() + { + var arguments = new object[] { }; + var func = requestBuilder.BuildRestResultFuncForMethod("Ping", new Type[] { }); + return (Task)func(Client, arguments); + } + + /// + Task IAmInterfaceB.Pong() + { + var arguments = new object[] { }; + var func = requestBuilder.BuildRestResultFuncForMethod("Pong", new Type[] { }); + return (Task)func(Client, arguments); + } + + } +} + namespace Refit.Tests { using Refit.Tests.RefitInternalGenerated; @@ -171,7 +280,7 @@ public AutoGeneratedIApiWithDecimal(HttpClient client, IRequestBuilder requestBu } /// - public virtual Task GetWithDecimal(decimal value) + Task IApiWithDecimal.GetWithDecimal(decimal value) { var arguments = new object[] { value }; var func = requestBuilder.BuildRestResultFuncForMethod("GetWithDecimal", new Type[] { typeof(decimal) }); @@ -202,7 +311,7 @@ public AutoGeneratedIBodylessApi(HttpClient client, IRequestBuilder requestBuild } /// - public virtual Task Post() + Task IBodylessApi.Post() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("Post", new Type[] { }); @@ -210,7 +319,7 @@ public virtual Task Post() } /// - public virtual Task Get() + Task IBodylessApi.Get() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("Get", new Type[] { }); @@ -218,7 +327,7 @@ public virtual Task Get() } /// - public virtual Task Head() + Task IBodylessApi.Head() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("Head", new Type[] { }); @@ -252,7 +361,7 @@ public AutoGeneratedIBoringCrudApi(HttpClient client, IRequestBuilder requestBui } /// - public virtual Task Create(T paylod) + Task IBoringCrudApi.Create(T paylod) { var arguments = new object[] { paylod }; var func = requestBuilder.BuildRestResultFuncForMethod("Create", new Type[] { typeof(T) }); @@ -260,7 +369,7 @@ public virtual Task Create(T paylod) } /// - public virtual Task> ReadAll() + Task> IBoringCrudApi.ReadAll() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("ReadAll", new Type[] { }); @@ -268,7 +377,7 @@ public virtual Task> ReadAll() } /// - public virtual Task ReadOne(TKey key) + Task IBoringCrudApi.ReadOne(TKey key) { var arguments = new object[] { key }; var func = requestBuilder.BuildRestResultFuncForMethod("ReadOne", new Type[] { typeof(TKey) }); @@ -276,7 +385,7 @@ public virtual Task ReadOne(TKey key) } /// - public virtual Task Update(TKey key,T payload) + Task IBoringCrudApi.Update(TKey key,T payload) { var arguments = new object[] { key,payload }; var func = requestBuilder.BuildRestResultFuncForMethod("Update", new Type[] { typeof(TKey),typeof(T) }); @@ -284,7 +393,7 @@ public virtual Task Update(TKey key,T payload) } /// - public virtual Task Delete(TKey key) + Task IBoringCrudApi.Delete(TKey key) { var arguments = new object[] { key }; var func = requestBuilder.BuildRestResultFuncForMethod("Delete", new Type[] { typeof(TKey) }); @@ -315,7 +424,7 @@ public AutoGeneratedIBrokenWebApi(HttpClient client, IRequestBuilder requestBuil } /// - public virtual Task PostAValue(string derp) + Task IBrokenWebApi.PostAValue(string derp) { var arguments = new object[] { derp }; var func = requestBuilder.BuildRestResultFuncForMethod("PostAValue", new Type[] { typeof(string) }); @@ -346,7 +455,7 @@ public AutoGeneratedIGitHubApi(HttpClient client, IRequestBuilder requestBuilder } /// - public virtual Task GetUser(string userName) + Task IGitHubApi.GetUser(string userName) { var arguments = new object[] { userName }; var func = requestBuilder.BuildRestResultFuncForMethod("GetUser", new Type[] { typeof(string) }); @@ -354,7 +463,7 @@ public virtual Task GetUser(string userName) } /// - public virtual IObservable GetUserObservable(string userName) + IObservable IGitHubApi.GetUserObservable(string userName) { var arguments = new object[] { userName }; var func = requestBuilder.BuildRestResultFuncForMethod("GetUserObservable", new Type[] { typeof(string) }); @@ -362,7 +471,7 @@ public virtual IObservable GetUserObservable(string userName) } /// - public virtual IObservable GetUserCamelCase(string userName) + IObservable IGitHubApi.GetUserCamelCase(string userName) { var arguments = new object[] { userName }; var func = requestBuilder.BuildRestResultFuncForMethod("GetUserCamelCase", new Type[] { typeof(string) }); @@ -370,7 +479,7 @@ public virtual IObservable GetUserCamelCase(string userName) } /// - public virtual Task> GetOrgMembers(string orgName) + Task> IGitHubApi.GetOrgMembers(string orgName) { var arguments = new object[] { orgName }; var func = requestBuilder.BuildRestResultFuncForMethod("GetOrgMembers", new Type[] { typeof(string) }); @@ -378,7 +487,7 @@ public virtual Task> GetOrgMembers(string orgName) } /// - public virtual Task FindUsers(string q) + Task IGitHubApi.FindUsers(string q) { var arguments = new object[] { q }; var func = requestBuilder.BuildRestResultFuncForMethod("FindUsers", new Type[] { typeof(string) }); @@ -386,7 +495,7 @@ public virtual Task FindUsers(string q) } /// - public virtual Task GetIndex() + Task IGitHubApi.GetIndex() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("GetIndex", new Type[] { }); @@ -394,7 +503,7 @@ public virtual Task GetIndex() } /// - public virtual IObservable GetIndexObservable() + IObservable IGitHubApi.GetIndexObservable() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("GetIndexObservable", new Type[] { }); @@ -402,7 +511,7 @@ public virtual IObservable GetIndexObservable() } /// - public virtual Task NothingToSeeHere() + Task IGitHubApi.NothingToSeeHere() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("NothingToSeeHere", new Type[] { }); @@ -410,7 +519,7 @@ public virtual Task NothingToSeeHere() } /// - public virtual Task> NothingToSeeHereWithMetadata() + Task> IGitHubApi.NothingToSeeHereWithMetadata() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("NothingToSeeHereWithMetadata", new Type[] { }); @@ -418,7 +527,7 @@ public virtual Task> NothingToSeeHereWithMetadata() } /// - public virtual Task> GetUserWithMetadata(string userName) + Task> IGitHubApi.GetUserWithMetadata(string userName) { var arguments = new object[] { userName }; var func = requestBuilder.BuildRestResultFuncForMethod("GetUserWithMetadata", new Type[] { typeof(string) }); @@ -426,7 +535,7 @@ public virtual Task> GetUserWithMetadata(string userName) } /// - public virtual IObservable> GetUserObservableWithMetadata(string userName) + IObservable> IGitHubApi.GetUserObservableWithMetadata(string userName) { var arguments = new object[] { userName }; var func = requestBuilder.BuildRestResultFuncForMethod("GetUserObservableWithMetadata", new Type[] { typeof(string) }); @@ -434,7 +543,7 @@ public virtual IObservable> GetUserObservableWithMetadata(stri } /// - public virtual Task CreateUser(User user) + Task IGitHubApi.CreateUser(User user) { var arguments = new object[] { user }; var func = requestBuilder.BuildRestResultFuncForMethod("CreateUser", new Type[] { typeof(User) }); @@ -442,7 +551,7 @@ public virtual Task CreateUser(User user) } /// - public virtual Task> CreateUserWithMetadata(User user) + Task> IGitHubApi.CreateUserWithMetadata(User user) { var arguments = new object[] { user }; var func = requestBuilder.BuildRestResultFuncForMethod("CreateUserWithMetadata", new Type[] { typeof(User) }); @@ -477,7 +586,7 @@ public AutoGeneratedIHttpBinApi(HttpClient client, IRequestBuilder requestBuilde } /// - public virtual Task Get(TParam param,THeader header) + Task IHttpBinApi.Get(TParam param,THeader header) { var arguments = new object[] { param,header }; var func = requestBuilder.BuildRestResultFuncForMethod("Get", new Type[] { typeof(TParam),typeof(THeader) }); @@ -485,7 +594,7 @@ public virtual Task Get(TParam param,THeader header) } /// - public virtual Task GetQuery(TParam param) + Task IHttpBinApi.GetQuery(TParam param) { var arguments = new object[] { param }; var func = requestBuilder.BuildRestResultFuncForMethod("GetQuery", new Type[] { typeof(TParam) }); @@ -493,7 +602,7 @@ public virtual Task GetQuery(TParam param) } /// - public virtual Task GetQueryWithIncludeParameterName(TParam param) + Task IHttpBinApi.GetQueryWithIncludeParameterName(TParam param) { var arguments = new object[] { param }; var func = requestBuilder.BuildRestResultFuncForMethod("GetQueryWithIncludeParameterName", new Type[] { typeof(TParam) }); @@ -501,7 +610,7 @@ public virtual Task GetQueryWithIncludeParameterName(TParam param) } /// - public virtual Task GetQuery1(TParam param) + Task IHttpBinApi.GetQuery1(TParam param) { var arguments = new object[] { param }; var func = requestBuilder.BuildRestResultFuncForMethod("GetQuery1", new Type[] { typeof(TParam) }, new Type[] { typeof(TValue) }); @@ -532,7 +641,7 @@ public AutoGeneratedIHttpContentApi(HttpClient client, IRequestBuilder requestBu } /// - public virtual Task PostFileUpload(HttpContent content) + Task IHttpContentApi.PostFileUpload(HttpContent content) { var arguments = new object[] { content }; var func = requestBuilder.BuildRestResultFuncForMethod("PostFileUpload", new Type[] { typeof(HttpContent) }); @@ -540,7 +649,7 @@ public virtual Task PostFileUpload(HttpContent content) } /// - public virtual Task> PostFileUploadWithMetadata(HttpContent content) + Task> IHttpContentApi.PostFileUploadWithMetadata(HttpContent content) { var arguments = new object[] { content }; var func = requestBuilder.BuildRestResultFuncForMethod("PostFileUploadWithMetadata", new Type[] { typeof(HttpContent) }); @@ -571,7 +680,7 @@ public AutoGeneratedResponseTestsIMyAliasService(HttpClient client, IRequestBuil } /// - public virtual Task GetTestObject() + Task ResponseTests.IMyAliasService.GetTestObject() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("GetTestObject", new Type[] { }); @@ -602,7 +711,7 @@ public AutoGeneratedAuthenticatedClientHandlerTestsIMyAuthenticatedService(HttpC } /// - public virtual Task GetUnauthenticated() + Task AuthenticatedClientHandlerTests.IMyAuthenticatedService.GetUnauthenticated() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("GetUnauthenticated", new Type[] { }); @@ -610,7 +719,7 @@ public virtual Task GetUnauthenticated() } /// - public virtual Task GetAuthenticated() + Task AuthenticatedClientHandlerTests.IMyAuthenticatedService.GetAuthenticated() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("GetAuthenticated", new Type[] { }); @@ -641,7 +750,7 @@ public AutoGeneratedINamespaceCollisionApi(HttpClient client, IRequestBuilder re } /// - public virtual Task SomeRequest() + Task INamespaceCollisionApi.SomeRequest() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("SomeRequest", new Type[] { }); @@ -672,7 +781,7 @@ public AutoGeneratedTestNestedINestedGitHubApi(HttpClient client, IRequestBuilde } /// - public virtual Task GetUser(string userName) + Task TestNested.INestedGitHubApi.GetUser(string userName) { var arguments = new object[] { userName }; var func = requestBuilder.BuildRestResultFuncForMethod("GetUser", new Type[] { typeof(string) }); @@ -680,7 +789,7 @@ public virtual Task GetUser(string userName) } /// - public virtual IObservable GetUserObservable(string userName) + IObservable TestNested.INestedGitHubApi.GetUserObservable(string userName) { var arguments = new object[] { userName }; var func = requestBuilder.BuildRestResultFuncForMethod("GetUserObservable", new Type[] { typeof(string) }); @@ -688,7 +797,7 @@ public virtual IObservable GetUserObservable(string userName) } /// - public virtual IObservable GetUserCamelCase(string userName) + IObservable TestNested.INestedGitHubApi.GetUserCamelCase(string userName) { var arguments = new object[] { userName }; var func = requestBuilder.BuildRestResultFuncForMethod("GetUserCamelCase", new Type[] { typeof(string) }); @@ -696,7 +805,7 @@ public virtual IObservable GetUserCamelCase(string userName) } /// - public virtual Task> GetOrgMembers(string orgName) + Task> TestNested.INestedGitHubApi.GetOrgMembers(string orgName) { var arguments = new object[] { orgName }; var func = requestBuilder.BuildRestResultFuncForMethod("GetOrgMembers", new Type[] { typeof(string) }); @@ -704,7 +813,7 @@ public virtual Task> GetOrgMembers(string orgName) } /// - public virtual Task FindUsers(string q) + Task TestNested.INestedGitHubApi.FindUsers(string q) { var arguments = new object[] { q }; var func = requestBuilder.BuildRestResultFuncForMethod("FindUsers", new Type[] { typeof(string) }); @@ -712,7 +821,7 @@ public virtual Task FindUsers(string q) } /// - public virtual Task GetIndex() + Task TestNested.INestedGitHubApi.GetIndex() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("GetIndex", new Type[] { }); @@ -720,7 +829,7 @@ public virtual Task GetIndex() } /// - public virtual IObservable GetIndexObservable() + IObservable TestNested.INestedGitHubApi.GetIndexObservable() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("GetIndexObservable", new Type[] { }); @@ -728,7 +837,7 @@ public virtual IObservable GetIndexObservable() } /// - public virtual Task NothingToSeeHere() + Task TestNested.INestedGitHubApi.NothingToSeeHere() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("NothingToSeeHere", new Type[] { }); @@ -759,8 +868,7 @@ public AutoGeneratedINonGenericInterfaceWithGenericMethod(HttpClient client, IRe } /// - public virtual Task PostMessage(T message) - where T : IMessage + Task INonGenericInterfaceWithGenericMethod.PostMessage(T message) { var arguments = new object[] { message }; var func = requestBuilder.BuildRestResultFuncForMethod("PostMessage", new Type[] { typeof(T) }, new Type[] { typeof(T) }); @@ -768,8 +876,7 @@ public virtual Task PostMessage(T message) } /// - public virtual Task PostMessage(T message,U param1,V param2) - where T : IMessage where U : T + Task INonGenericInterfaceWithGenericMethod.PostMessage(T message,U param1,V param2) { var arguments = new object[] { message,param1,param2 }; var func = requestBuilder.BuildRestResultFuncForMethod("PostMessage", new Type[] { typeof(T),typeof(U),typeof(V) }, new Type[] { typeof(T), typeof(U), typeof(V) }); @@ -800,7 +907,7 @@ public AutoGeneratedINpmJs(HttpClient client, IRequestBuilder requestBuilder) } /// - public virtual Task GetCongruence() + Task INpmJs.GetCongruence() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("GetCongruence", new Type[] { }); @@ -831,7 +938,7 @@ public AutoGeneratedIRequestBin(HttpClient client, IRequestBuilder requestBuilde } /// - public virtual Task Post() + Task IRequestBin.Post() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("Post", new Type[] { }); @@ -839,7 +946,7 @@ public virtual Task Post() } /// - public virtual Task PostRawStringDefault(string str) + Task IRequestBin.PostRawStringDefault(string str) { var arguments = new object[] { str }; var func = requestBuilder.BuildRestResultFuncForMethod("PostRawStringDefault", new Type[] { typeof(string) }); @@ -847,7 +954,7 @@ public virtual Task PostRawStringDefault(string str) } /// - public virtual Task PostRawStringJson(string str) + Task IRequestBin.PostRawStringJson(string str) { var arguments = new object[] { str }; var func = requestBuilder.BuildRestResultFuncForMethod("PostRawStringJson", new Type[] { typeof(string) }); @@ -855,7 +962,7 @@ public virtual Task PostRawStringJson(string str) } /// - public virtual Task PostRawStringUrlEncoded(string str) + Task IRequestBin.PostRawStringUrlEncoded(string str) { var arguments = new object[] { str }; var func = requestBuilder.BuildRestResultFuncForMethod("PostRawStringUrlEncoded", new Type[] { typeof(string) }); @@ -863,7 +970,7 @@ public virtual Task PostRawStringUrlEncoded(string str) } /// - public virtual Task PostGeneric(T param) + Task IRequestBin.PostGeneric(T param) { var arguments = new object[] { param }; var func = requestBuilder.BuildRestResultFuncForMethod("PostGeneric", new Type[] { typeof(T) }, new Type[] { typeof(T) }); @@ -894,7 +1001,7 @@ public AutoGeneratedIRunscopeApi(HttpClient client, IRequestBuilder requestBuild } /// - public virtual Task UploadStream(Stream stream) + Task IRunscopeApi.UploadStream(Stream stream) { var arguments = new object[] { stream }; var func = requestBuilder.BuildRestResultFuncForMethod("UploadStream", new Type[] { typeof(Stream) }); @@ -902,7 +1009,7 @@ public virtual Task UploadStream(Stream stream) } /// - public virtual Task UploadStreamPart(StreamPart stream) + Task IRunscopeApi.UploadStreamPart(StreamPart stream) { var arguments = new object[] { stream }; var func = requestBuilder.BuildRestResultFuncForMethod("UploadStreamPart", new Type[] { typeof(StreamPart) }); @@ -910,7 +1017,7 @@ public virtual Task UploadStreamPart(StreamPart stream) } /// - public virtual Task UploadBytes(byte[] bytes) + Task IRunscopeApi.UploadBytes(byte[] bytes) { var arguments = new object[] { bytes }; var func = requestBuilder.BuildRestResultFuncForMethod("UploadBytes", new Type[] { typeof(byte[]) }); @@ -918,7 +1025,7 @@ public virtual Task UploadBytes(byte[] bytes) } /// - public virtual Task UploadBytesPart(ByteArrayPart bytes) + Task IRunscopeApi.UploadBytesPart(ByteArrayPart bytes) { var arguments = new object[] { bytes }; var func = requestBuilder.BuildRestResultFuncForMethod("UploadBytesPart", new Type[] { typeof(ByteArrayPart) }); @@ -926,7 +1033,7 @@ public virtual Task UploadBytesPart(ByteArrayPart bytes) } /// - public virtual Task UploadString(string someString) + Task IRunscopeApi.UploadString(string someString) { var arguments = new object[] { someString }; var func = requestBuilder.BuildRestResultFuncForMethod("UploadString", new Type[] { typeof(string) }); @@ -934,7 +1041,7 @@ public virtual Task UploadString(string someString) } /// - public virtual Task UploadFileInfo(IEnumerable fileInfos,FileInfo anotherFile) + Task IRunscopeApi.UploadFileInfo(IEnumerable fileInfos,FileInfo anotherFile) { var arguments = new object[] { fileInfos,anotherFile }; var func = requestBuilder.BuildRestResultFuncForMethod("UploadFileInfo", new Type[] { typeof(IEnumerable),typeof(FileInfo) }); @@ -942,7 +1049,7 @@ public virtual Task UploadFileInfo(IEnumerable fi } /// - public virtual Task UploadFileInfoPart(IEnumerable fileInfos,FileInfoPart anotherFile) + Task IRunscopeApi.UploadFileInfoPart(IEnumerable fileInfos,FileInfoPart anotherFile) { var arguments = new object[] { fileInfos,anotherFile }; var func = requestBuilder.BuildRestResultFuncForMethod("UploadFileInfoPart", new Type[] { typeof(IEnumerable),typeof(FileInfoPart) }); @@ -950,7 +1057,7 @@ public virtual Task UploadFileInfoPart(IEnumerable - public virtual Task UploadJsonObject(ModelObject theObject) + Task IRunscopeApi.UploadJsonObject(ModelObject theObject) { var arguments = new object[] { theObject }; var func = requestBuilder.BuildRestResultFuncForMethod("UploadJsonObject", new Type[] { typeof(ModelObject) }); @@ -958,7 +1065,7 @@ public virtual Task UploadJsonObject(ModelObject theObject) } /// - public virtual Task UploadJsonObjects(IEnumerable theObjects) + Task IRunscopeApi.UploadJsonObjects(IEnumerable theObjects) { var arguments = new object[] { theObjects }; var func = requestBuilder.BuildRestResultFuncForMethod("UploadJsonObjects", new Type[] { typeof(IEnumerable) }); @@ -966,7 +1073,7 @@ public virtual Task UploadJsonObjects(IEnumerable - public virtual Task UploadMixedObjects(IEnumerable theObjects,AnotherModel anotherModel,FileInfo aFile,AnEnum anEnum,string aString,int anInt) + Task IRunscopeApi.UploadMixedObjects(IEnumerable theObjects,AnotherModel anotherModel,FileInfo aFile,AnEnum anEnum,string aString,int anInt) { var arguments = new object[] { theObjects,anotherModel,aFile,anEnum,aString,anInt }; var func = requestBuilder.BuildRestResultFuncForMethod("UploadMixedObjects", new Type[] { typeof(IEnumerable),typeof(AnotherModel),typeof(FileInfo),typeof(AnEnum),typeof(string),typeof(int) }); @@ -974,7 +1081,7 @@ public virtual Task UploadMixedObjects(IEnumerable - public virtual Task UploadHttpContent(HttpContent content) + Task IRunscopeApi.UploadHttpContent(HttpContent content) { var arguments = new object[] { content }; var func = requestBuilder.BuildRestResultFuncForMethod("UploadHttpContent", new Type[] { typeof(HttpContent) }); @@ -1005,7 +1112,7 @@ public AutoGeneratedIServiceWithoutNamespace(HttpClient client, IRequestBuilder } /// - public virtual Task GetRoot() + Task IServiceWithoutNamespace.GetRoot() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("GetRoot", new Type[] { }); @@ -1013,7 +1120,7 @@ public virtual Task GetRoot() } /// - public virtual Task PostRoot() + Task IServiceWithoutNamespace.PostRoot() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("PostRoot", new Type[] { }); @@ -1044,7 +1151,7 @@ public AutoGeneratedIStreamApi(HttpClient client, IRequestBuilder requestBuilder } /// - public virtual Task GetRemoteFile(string filename) + Task IStreamApi.GetRemoteFile(string filename) { var arguments = new object[] { filename }; var func = requestBuilder.BuildRestResultFuncForMethod("GetRemoteFile", new Type[] { typeof(string) }); @@ -1052,7 +1159,7 @@ public virtual Task GetRemoteFile(string filename) } /// - public virtual Task> GetRemoteFileWithMetadata(string filename) + Task> IStreamApi.GetRemoteFileWithMetadata(string filename) { var arguments = new object[] { filename }; var func = requestBuilder.BuildRestResultFuncForMethod("GetRemoteFileWithMetadata", new Type[] { typeof(string) }); @@ -1087,7 +1194,7 @@ public AutoGeneratedIUseOverloadedGenericMethods(HttpClient client, IRequestBuil } /// - public virtual Task Get() + Task IUseOverloadedGenericMethods.Get() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("Get", new Type[] { }); @@ -1095,7 +1202,7 @@ public virtual Task Get() } /// - public virtual Task Get(TParam param,THeader header) + Task IUseOverloadedGenericMethods.Get(TParam param,THeader header) { var arguments = new object[] { param,header }; var func = requestBuilder.BuildRestResultFuncForMethod("Get", new Type[] { typeof(TParam),typeof(THeader) }); @@ -1103,7 +1210,7 @@ public virtual Task Get(TParam param,THeader header) } /// - public virtual Task Get(THeader param,TParam header) + Task IUseOverloadedGenericMethods.Get(THeader param,TParam header) { var arguments = new object[] { param,header }; var func = requestBuilder.BuildRestResultFuncForMethod("Get", new Type[] { typeof(THeader),typeof(TParam) }); @@ -1111,7 +1218,7 @@ public virtual Task Get(THeader param,TParam header) } /// - public virtual Task Get(int httpstatuscode) + Task IUseOverloadedGenericMethods.Get(int httpstatuscode) { var arguments = new object[] { httpstatuscode }; var func = requestBuilder.BuildRestResultFuncForMethod("Get", new Type[] { typeof(int) }); @@ -1119,7 +1226,7 @@ public virtual Task Get(int httpstatuscode) } /// - public virtual Task Get(int someVal) + Task IUseOverloadedGenericMethods.Get(int someVal) { var arguments = new object[] { someVal }; var func = requestBuilder.BuildRestResultFuncForMethod("Get", new Type[] { typeof(int) }, new Type[] { typeof(TValue) }); @@ -1127,7 +1234,7 @@ public virtual Task Get(int someVal) } /// - public virtual Task Get(TInput input) + Task IUseOverloadedGenericMethods.Get(TInput input) { var arguments = new object[] { input }; var func = requestBuilder.BuildRestResultFuncForMethod("Get", new Type[] { typeof(TInput) }, new Type[] { typeof(TValue), typeof(TInput) }); @@ -1135,7 +1242,7 @@ public virtual Task Get(TInput input) } /// - public virtual Task Get(TInput1 input1,TInput2 input2) + Task IUseOverloadedGenericMethods.Get(TInput1 input1,TInput2 input2) { var arguments = new object[] { input1,input2 }; var func = requestBuilder.BuildRestResultFuncForMethod("Get", new Type[] { typeof(TInput1),typeof(TInput2) }, new Type[] { typeof(TInput1), typeof(TInput2) }); @@ -1166,7 +1273,7 @@ public AutoGeneratedIUseOverloadedMethods(HttpClient client, IRequestBuilder req } /// - public virtual Task Get() + Task IUseOverloadedMethods.Get() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("Get", new Type[] { }); @@ -1174,7 +1281,7 @@ public virtual Task Get() } /// - public virtual Task Get(int httpstatuscode) + Task IUseOverloadedMethods.Get(int httpstatuscode) { var arguments = new object[] { httpstatuscode }; var func = requestBuilder.BuildRestResultFuncForMethod("Get", new Type[] { typeof(int) }); diff --git a/Refit.Tests/RefitStubs.NetCore2.cs b/Refit.Tests/RefitStubs.NetCore2.cs index 37823779c..c9c1f7bc6 100644 --- a/Refit.Tests/RefitStubs.NetCore2.cs +++ b/Refit.Tests/RefitStubs.NetCore2.cs @@ -73,7 +73,7 @@ public AutoGeneratedIAmARefitInterfaceButNobodyUsesMe(HttpClient client, IReques } /// - public virtual Task RefitMethod() + Task IAmARefitInterfaceButNobodyUsesMe.RefitMethod() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("RefitMethod", new Type[] { }); @@ -81,7 +81,7 @@ public virtual Task RefitMethod() } /// - public virtual Task AnotherRefitMethod() + Task IAmARefitInterfaceButNobodyUsesMe.AnotherRefitMethod() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("AnotherRefitMethod", new Type[] { }); @@ -89,13 +89,13 @@ public virtual Task AnotherRefitMethod() } /// - public virtual Task NoConstantsAllowed() + Task IAmARefitInterfaceButNobodyUsesMe.NoConstantsAllowed() { throw new NotImplementedException("Either this method has no Refit HTTP method attribute or you've used something other than a string literal for the 'path' argument."); } /// - public virtual Task SpacesShouldntBreakMe() + Task IAmARefitInterfaceButNobodyUsesMe.SpacesShouldntBreakMe() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("SpacesShouldntBreakMe", new Type[] { }); @@ -103,7 +103,7 @@ public virtual Task SpacesShouldntBreakMe() } /// - public virtual Task ReservedWordsForParameterNames(int @int,string @string,float @long) + Task IAmARefitInterfaceButNobodyUsesMe.ReservedWordsForParameterNames(int @int,string @string,float @long) { var arguments = new object[] { @int,@string,@long }; var func = requestBuilder.BuildRestResultFuncForMethod("ReservedWordsForParameterNames", new Type[] { typeof(int),typeof(string),typeof(float) }); @@ -134,7 +134,7 @@ public AutoGeneratedIAmHalfRefit(HttpClient client, IRequestBuilder requestBuild } /// - public virtual Task Post() + Task IAmHalfRefit.Post() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("Post", new Type[] { }); @@ -142,7 +142,7 @@ public virtual Task Post() } /// - public virtual Task Get() + Task IAmHalfRefit.Get() { throw new NotImplementedException("Either this method has no Refit HTTP method attribute or you've used something other than a string literal for the 'path' argument."); } @@ -150,6 +150,115 @@ public virtual Task Get() } } +namespace Refit.Tests +{ + using Refit.Tests.RefitInternalGenerated; + + /// + [ExcludeFromCodeCoverage] + [DebuggerNonUserCode] + [Preserve] + partial class AutoGeneratedIAmInterfaceA : IAmInterfaceA { + /// + public HttpClient Client { get; protected set; } + readonly IRequestBuilder requestBuilder; + + /// + public AutoGeneratedIAmInterfaceA(HttpClient client, IRequestBuilder requestBuilder) + { + Client = client; + this.requestBuilder = requestBuilder; + } + + /// + Task IAmInterfaceA.Ping() + { + var arguments = new object[] { }; + var func = requestBuilder.BuildRestResultFuncForMethod("Ping", new Type[] { }); + return (Task)func(Client, arguments); + } + + } +} + +namespace Refit.Tests +{ + using Refit.Tests.RefitInternalGenerated; + + /// + [ExcludeFromCodeCoverage] + [DebuggerNonUserCode] + [Preserve] + partial class AutoGeneratedIAmInterfaceB : IAmInterfaceB { + /// + public HttpClient Client { get; protected set; } + readonly IRequestBuilder requestBuilder; + + /// + public AutoGeneratedIAmInterfaceB(HttpClient client, IRequestBuilder requestBuilder) + { + Client = client; + this.requestBuilder = requestBuilder; + } + + /// + Task IAmInterfaceB.Pong() + { + var arguments = new object[] { }; + var func = requestBuilder.BuildRestResultFuncForMethod("Pong", new Type[] { }); + return (Task)func(Client, arguments); + } + + } +} + +namespace Refit.Tests +{ + using Refit.Tests.RefitInternalGenerated; + + /// + [ExcludeFromCodeCoverage] + [DebuggerNonUserCode] + [Preserve] + partial class AutoGeneratedIAmInterfaceC : IAmInterfaceC { + /// + public HttpClient Client { get; protected set; } + readonly IRequestBuilder requestBuilder; + + /// + public AutoGeneratedIAmInterfaceC(HttpClient client, IRequestBuilder requestBuilder) + { + Client = client; + this.requestBuilder = requestBuilder; + } + + /// + Task IAmInterfaceC.Pang() + { + var arguments = new object[] { }; + var func = requestBuilder.BuildRestResultFuncForMethod("Pang", new Type[] { }); + return (Task)func(Client, arguments); + } + + /// + Task IAmInterfaceA.Ping() + { + var arguments = new object[] { }; + var func = requestBuilder.BuildRestResultFuncForMethod("Ping", new Type[] { }); + return (Task)func(Client, arguments); + } + + /// + Task IAmInterfaceB.Pong() + { + var arguments = new object[] { }; + var func = requestBuilder.BuildRestResultFuncForMethod("Pong", new Type[] { }); + return (Task)func(Client, arguments); + } + + } +} + namespace Refit.Tests { using Refit.Tests.RefitInternalGenerated; @@ -171,7 +280,7 @@ public AutoGeneratedIApiWithDecimal(HttpClient client, IRequestBuilder requestBu } /// - public virtual Task GetWithDecimal(decimal value) + Task IApiWithDecimal.GetWithDecimal(decimal value) { var arguments = new object[] { value }; var func = requestBuilder.BuildRestResultFuncForMethod("GetWithDecimal", new Type[] { typeof(decimal) }); @@ -202,7 +311,7 @@ public AutoGeneratedIBodylessApi(HttpClient client, IRequestBuilder requestBuild } /// - public virtual Task Post() + Task IBodylessApi.Post() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("Post", new Type[] { }); @@ -210,7 +319,7 @@ public virtual Task Post() } /// - public virtual Task Get() + Task IBodylessApi.Get() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("Get", new Type[] { }); @@ -218,7 +327,7 @@ public virtual Task Get() } /// - public virtual Task Head() + Task IBodylessApi.Head() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("Head", new Type[] { }); @@ -252,7 +361,7 @@ public AutoGeneratedIBoringCrudApi(HttpClient client, IRequestBuilder requestBui } /// - public virtual Task Create(T paylod) + Task IBoringCrudApi.Create(T paylod) { var arguments = new object[] { paylod }; var func = requestBuilder.BuildRestResultFuncForMethod("Create", new Type[] { typeof(T) }); @@ -260,7 +369,7 @@ public virtual Task Create(T paylod) } /// - public virtual Task> ReadAll() + Task> IBoringCrudApi.ReadAll() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("ReadAll", new Type[] { }); @@ -268,7 +377,7 @@ public virtual Task> ReadAll() } /// - public virtual Task ReadOne(TKey key) + Task IBoringCrudApi.ReadOne(TKey key) { var arguments = new object[] { key }; var func = requestBuilder.BuildRestResultFuncForMethod("ReadOne", new Type[] { typeof(TKey) }); @@ -276,7 +385,7 @@ public virtual Task ReadOne(TKey key) } /// - public virtual Task Update(TKey key,T payload) + Task IBoringCrudApi.Update(TKey key,T payload) { var arguments = new object[] { key,payload }; var func = requestBuilder.BuildRestResultFuncForMethod("Update", new Type[] { typeof(TKey),typeof(T) }); @@ -284,7 +393,7 @@ public virtual Task Update(TKey key,T payload) } /// - public virtual Task Delete(TKey key) + Task IBoringCrudApi.Delete(TKey key) { var arguments = new object[] { key }; var func = requestBuilder.BuildRestResultFuncForMethod("Delete", new Type[] { typeof(TKey) }); @@ -315,7 +424,7 @@ public AutoGeneratedIBrokenWebApi(HttpClient client, IRequestBuilder requestBuil } /// - public virtual Task PostAValue(string derp) + Task IBrokenWebApi.PostAValue(string derp) { var arguments = new object[] { derp }; var func = requestBuilder.BuildRestResultFuncForMethod("PostAValue", new Type[] { typeof(string) }); @@ -346,7 +455,7 @@ public AutoGeneratedIGitHubApi(HttpClient client, IRequestBuilder requestBuilder } /// - public virtual Task GetUser(string userName) + Task IGitHubApi.GetUser(string userName) { var arguments = new object[] { userName }; var func = requestBuilder.BuildRestResultFuncForMethod("GetUser", new Type[] { typeof(string) }); @@ -354,7 +463,7 @@ public virtual Task GetUser(string userName) } /// - public virtual IObservable GetUserObservable(string userName) + IObservable IGitHubApi.GetUserObservable(string userName) { var arguments = new object[] { userName }; var func = requestBuilder.BuildRestResultFuncForMethod("GetUserObservable", new Type[] { typeof(string) }); @@ -362,7 +471,7 @@ public virtual IObservable GetUserObservable(string userName) } /// - public virtual IObservable GetUserCamelCase(string userName) + IObservable IGitHubApi.GetUserCamelCase(string userName) { var arguments = new object[] { userName }; var func = requestBuilder.BuildRestResultFuncForMethod("GetUserCamelCase", new Type[] { typeof(string) }); @@ -370,7 +479,7 @@ public virtual IObservable GetUserCamelCase(string userName) } /// - public virtual Task> GetOrgMembers(string orgName) + Task> IGitHubApi.GetOrgMembers(string orgName) { var arguments = new object[] { orgName }; var func = requestBuilder.BuildRestResultFuncForMethod("GetOrgMembers", new Type[] { typeof(string) }); @@ -378,7 +487,7 @@ public virtual Task> GetOrgMembers(string orgName) } /// - public virtual Task FindUsers(string q) + Task IGitHubApi.FindUsers(string q) { var arguments = new object[] { q }; var func = requestBuilder.BuildRestResultFuncForMethod("FindUsers", new Type[] { typeof(string) }); @@ -386,7 +495,7 @@ public virtual Task FindUsers(string q) } /// - public virtual Task GetIndex() + Task IGitHubApi.GetIndex() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("GetIndex", new Type[] { }); @@ -394,7 +503,7 @@ public virtual Task GetIndex() } /// - public virtual IObservable GetIndexObservable() + IObservable IGitHubApi.GetIndexObservable() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("GetIndexObservable", new Type[] { }); @@ -402,7 +511,7 @@ public virtual IObservable GetIndexObservable() } /// - public virtual Task NothingToSeeHere() + Task IGitHubApi.NothingToSeeHere() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("NothingToSeeHere", new Type[] { }); @@ -410,7 +519,7 @@ public virtual Task NothingToSeeHere() } /// - public virtual Task> NothingToSeeHereWithMetadata() + Task> IGitHubApi.NothingToSeeHereWithMetadata() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("NothingToSeeHereWithMetadata", new Type[] { }); @@ -418,7 +527,7 @@ public virtual Task> NothingToSeeHereWithMetadata() } /// - public virtual Task> GetUserWithMetadata(string userName) + Task> IGitHubApi.GetUserWithMetadata(string userName) { var arguments = new object[] { userName }; var func = requestBuilder.BuildRestResultFuncForMethod("GetUserWithMetadata", new Type[] { typeof(string) }); @@ -426,7 +535,7 @@ public virtual Task> GetUserWithMetadata(string userName) } /// - public virtual IObservable> GetUserObservableWithMetadata(string userName) + IObservable> IGitHubApi.GetUserObservableWithMetadata(string userName) { var arguments = new object[] { userName }; var func = requestBuilder.BuildRestResultFuncForMethod("GetUserObservableWithMetadata", new Type[] { typeof(string) }); @@ -434,7 +543,7 @@ public virtual IObservable> GetUserObservableWithMetadata(stri } /// - public virtual Task CreateUser(User user) + Task IGitHubApi.CreateUser(User user) { var arguments = new object[] { user }; var func = requestBuilder.BuildRestResultFuncForMethod("CreateUser", new Type[] { typeof(User) }); @@ -442,7 +551,7 @@ public virtual Task CreateUser(User user) } /// - public virtual Task> CreateUserWithMetadata(User user) + Task> IGitHubApi.CreateUserWithMetadata(User user) { var arguments = new object[] { user }; var func = requestBuilder.BuildRestResultFuncForMethod("CreateUserWithMetadata", new Type[] { typeof(User) }); @@ -477,7 +586,7 @@ public AutoGeneratedIHttpBinApi(HttpClient client, IRequestBuilder requestBuilde } /// - public virtual Task Get(TParam param,THeader header) + Task IHttpBinApi.Get(TParam param,THeader header) { var arguments = new object[] { param,header }; var func = requestBuilder.BuildRestResultFuncForMethod("Get", new Type[] { typeof(TParam),typeof(THeader) }); @@ -485,7 +594,7 @@ public virtual Task Get(TParam param,THeader header) } /// - public virtual Task GetQuery(TParam param) + Task IHttpBinApi.GetQuery(TParam param) { var arguments = new object[] { param }; var func = requestBuilder.BuildRestResultFuncForMethod("GetQuery", new Type[] { typeof(TParam) }); @@ -493,7 +602,7 @@ public virtual Task GetQuery(TParam param) } /// - public virtual Task GetQueryWithIncludeParameterName(TParam param) + Task IHttpBinApi.GetQueryWithIncludeParameterName(TParam param) { var arguments = new object[] { param }; var func = requestBuilder.BuildRestResultFuncForMethod("GetQueryWithIncludeParameterName", new Type[] { typeof(TParam) }); @@ -501,7 +610,7 @@ public virtual Task GetQueryWithIncludeParameterName(TParam param) } /// - public virtual Task GetQuery1(TParam param) + Task IHttpBinApi.GetQuery1(TParam param) { var arguments = new object[] { param }; var func = requestBuilder.BuildRestResultFuncForMethod("GetQuery1", new Type[] { typeof(TParam) }, new Type[] { typeof(TValue) }); @@ -532,7 +641,7 @@ public AutoGeneratedIHttpContentApi(HttpClient client, IRequestBuilder requestBu } /// - public virtual Task PostFileUpload(HttpContent content) + Task IHttpContentApi.PostFileUpload(HttpContent content) { var arguments = new object[] { content }; var func = requestBuilder.BuildRestResultFuncForMethod("PostFileUpload", new Type[] { typeof(HttpContent) }); @@ -540,7 +649,7 @@ public virtual Task PostFileUpload(HttpContent content) } /// - public virtual Task> PostFileUploadWithMetadata(HttpContent content) + Task> IHttpContentApi.PostFileUploadWithMetadata(HttpContent content) { var arguments = new object[] { content }; var func = requestBuilder.BuildRestResultFuncForMethod("PostFileUploadWithMetadata", new Type[] { typeof(HttpContent) }); @@ -571,7 +680,7 @@ public AutoGeneratedResponseTestsIMyAliasService(HttpClient client, IRequestBuil } /// - public virtual Task GetTestObject() + Task ResponseTests.IMyAliasService.GetTestObject() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("GetTestObject", new Type[] { }); @@ -602,7 +711,7 @@ public AutoGeneratedAuthenticatedClientHandlerTestsIMyAuthenticatedService(HttpC } /// - public virtual Task GetUnauthenticated() + Task AuthenticatedClientHandlerTests.IMyAuthenticatedService.GetUnauthenticated() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("GetUnauthenticated", new Type[] { }); @@ -610,7 +719,7 @@ public virtual Task GetUnauthenticated() } /// - public virtual Task GetAuthenticated() + Task AuthenticatedClientHandlerTests.IMyAuthenticatedService.GetAuthenticated() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("GetAuthenticated", new Type[] { }); @@ -641,7 +750,7 @@ public AutoGeneratedINamespaceCollisionApi(HttpClient client, IRequestBuilder re } /// - public virtual Task SomeRequest() + Task INamespaceCollisionApi.SomeRequest() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("SomeRequest", new Type[] { }); @@ -672,7 +781,7 @@ public AutoGeneratedTestNestedINestedGitHubApi(HttpClient client, IRequestBuilde } /// - public virtual Task GetUser(string userName) + Task TestNested.INestedGitHubApi.GetUser(string userName) { var arguments = new object[] { userName }; var func = requestBuilder.BuildRestResultFuncForMethod("GetUser", new Type[] { typeof(string) }); @@ -680,7 +789,7 @@ public virtual Task GetUser(string userName) } /// - public virtual IObservable GetUserObservable(string userName) + IObservable TestNested.INestedGitHubApi.GetUserObservable(string userName) { var arguments = new object[] { userName }; var func = requestBuilder.BuildRestResultFuncForMethod("GetUserObservable", new Type[] { typeof(string) }); @@ -688,7 +797,7 @@ public virtual IObservable GetUserObservable(string userName) } /// - public virtual IObservable GetUserCamelCase(string userName) + IObservable TestNested.INestedGitHubApi.GetUserCamelCase(string userName) { var arguments = new object[] { userName }; var func = requestBuilder.BuildRestResultFuncForMethod("GetUserCamelCase", new Type[] { typeof(string) }); @@ -696,7 +805,7 @@ public virtual IObservable GetUserCamelCase(string userName) } /// - public virtual Task> GetOrgMembers(string orgName) + Task> TestNested.INestedGitHubApi.GetOrgMembers(string orgName) { var arguments = new object[] { orgName }; var func = requestBuilder.BuildRestResultFuncForMethod("GetOrgMembers", new Type[] { typeof(string) }); @@ -704,7 +813,7 @@ public virtual Task> GetOrgMembers(string orgName) } /// - public virtual Task FindUsers(string q) + Task TestNested.INestedGitHubApi.FindUsers(string q) { var arguments = new object[] { q }; var func = requestBuilder.BuildRestResultFuncForMethod("FindUsers", new Type[] { typeof(string) }); @@ -712,7 +821,7 @@ public virtual Task FindUsers(string q) } /// - public virtual Task GetIndex() + Task TestNested.INestedGitHubApi.GetIndex() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("GetIndex", new Type[] { }); @@ -720,7 +829,7 @@ public virtual Task GetIndex() } /// - public virtual IObservable GetIndexObservable() + IObservable TestNested.INestedGitHubApi.GetIndexObservable() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("GetIndexObservable", new Type[] { }); @@ -728,7 +837,7 @@ public virtual IObservable GetIndexObservable() } /// - public virtual Task NothingToSeeHere() + Task TestNested.INestedGitHubApi.NothingToSeeHere() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("NothingToSeeHere", new Type[] { }); @@ -759,8 +868,7 @@ public AutoGeneratedINonGenericInterfaceWithGenericMethod(HttpClient client, IRe } /// - public virtual Task PostMessage(T message) - where T : IMessage + Task INonGenericInterfaceWithGenericMethod.PostMessage(T message) { var arguments = new object[] { message }; var func = requestBuilder.BuildRestResultFuncForMethod("PostMessage", new Type[] { typeof(T) }, new Type[] { typeof(T) }); @@ -768,8 +876,7 @@ public virtual Task PostMessage(T message) } /// - public virtual Task PostMessage(T message,U param1,V param2) - where T : IMessage where U : T + Task INonGenericInterfaceWithGenericMethod.PostMessage(T message,U param1,V param2) { var arguments = new object[] { message,param1,param2 }; var func = requestBuilder.BuildRestResultFuncForMethod("PostMessage", new Type[] { typeof(T),typeof(U),typeof(V) }, new Type[] { typeof(T), typeof(U), typeof(V) }); @@ -800,7 +907,7 @@ public AutoGeneratedINpmJs(HttpClient client, IRequestBuilder requestBuilder) } /// - public virtual Task GetCongruence() + Task INpmJs.GetCongruence() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("GetCongruence", new Type[] { }); @@ -831,7 +938,7 @@ public AutoGeneratedIRequestBin(HttpClient client, IRequestBuilder requestBuilde } /// - public virtual Task Post() + Task IRequestBin.Post() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("Post", new Type[] { }); @@ -839,7 +946,7 @@ public virtual Task Post() } /// - public virtual Task PostRawStringDefault(string str) + Task IRequestBin.PostRawStringDefault(string str) { var arguments = new object[] { str }; var func = requestBuilder.BuildRestResultFuncForMethod("PostRawStringDefault", new Type[] { typeof(string) }); @@ -847,7 +954,7 @@ public virtual Task PostRawStringDefault(string str) } /// - public virtual Task PostRawStringJson(string str) + Task IRequestBin.PostRawStringJson(string str) { var arguments = new object[] { str }; var func = requestBuilder.BuildRestResultFuncForMethod("PostRawStringJson", new Type[] { typeof(string) }); @@ -855,7 +962,7 @@ public virtual Task PostRawStringJson(string str) } /// - public virtual Task PostRawStringUrlEncoded(string str) + Task IRequestBin.PostRawStringUrlEncoded(string str) { var arguments = new object[] { str }; var func = requestBuilder.BuildRestResultFuncForMethod("PostRawStringUrlEncoded", new Type[] { typeof(string) }); @@ -863,7 +970,7 @@ public virtual Task PostRawStringUrlEncoded(string str) } /// - public virtual Task PostGeneric(T param) + Task IRequestBin.PostGeneric(T param) { var arguments = new object[] { param }; var func = requestBuilder.BuildRestResultFuncForMethod("PostGeneric", new Type[] { typeof(T) }, new Type[] { typeof(T) }); @@ -894,7 +1001,7 @@ public AutoGeneratedIRunscopeApi(HttpClient client, IRequestBuilder requestBuild } /// - public virtual Task UploadStream(Stream stream) + Task IRunscopeApi.UploadStream(Stream stream) { var arguments = new object[] { stream }; var func = requestBuilder.BuildRestResultFuncForMethod("UploadStream", new Type[] { typeof(Stream) }); @@ -902,7 +1009,7 @@ public virtual Task UploadStream(Stream stream) } /// - public virtual Task UploadStreamPart(StreamPart stream) + Task IRunscopeApi.UploadStreamPart(StreamPart stream) { var arguments = new object[] { stream }; var func = requestBuilder.BuildRestResultFuncForMethod("UploadStreamPart", new Type[] { typeof(StreamPart) }); @@ -910,7 +1017,7 @@ public virtual Task UploadStreamPart(StreamPart stream) } /// - public virtual Task UploadBytes(byte[] bytes) + Task IRunscopeApi.UploadBytes(byte[] bytes) { var arguments = new object[] { bytes }; var func = requestBuilder.BuildRestResultFuncForMethod("UploadBytes", new Type[] { typeof(byte[]) }); @@ -918,7 +1025,7 @@ public virtual Task UploadBytes(byte[] bytes) } /// - public virtual Task UploadBytesPart(ByteArrayPart bytes) + Task IRunscopeApi.UploadBytesPart(ByteArrayPart bytes) { var arguments = new object[] { bytes }; var func = requestBuilder.BuildRestResultFuncForMethod("UploadBytesPart", new Type[] { typeof(ByteArrayPart) }); @@ -926,7 +1033,7 @@ public virtual Task UploadBytesPart(ByteArrayPart bytes) } /// - public virtual Task UploadString(string someString) + Task IRunscopeApi.UploadString(string someString) { var arguments = new object[] { someString }; var func = requestBuilder.BuildRestResultFuncForMethod("UploadString", new Type[] { typeof(string) }); @@ -934,7 +1041,7 @@ public virtual Task UploadString(string someString) } /// - public virtual Task UploadFileInfo(IEnumerable fileInfos,FileInfo anotherFile) + Task IRunscopeApi.UploadFileInfo(IEnumerable fileInfos,FileInfo anotherFile) { var arguments = new object[] { fileInfos,anotherFile }; var func = requestBuilder.BuildRestResultFuncForMethod("UploadFileInfo", new Type[] { typeof(IEnumerable),typeof(FileInfo) }); @@ -942,7 +1049,7 @@ public virtual Task UploadFileInfo(IEnumerable fi } /// - public virtual Task UploadFileInfoPart(IEnumerable fileInfos,FileInfoPart anotherFile) + Task IRunscopeApi.UploadFileInfoPart(IEnumerable fileInfos,FileInfoPart anotherFile) { var arguments = new object[] { fileInfos,anotherFile }; var func = requestBuilder.BuildRestResultFuncForMethod("UploadFileInfoPart", new Type[] { typeof(IEnumerable),typeof(FileInfoPart) }); @@ -950,7 +1057,7 @@ public virtual Task UploadFileInfoPart(IEnumerable - public virtual Task UploadJsonObject(ModelObject theObject) + Task IRunscopeApi.UploadJsonObject(ModelObject theObject) { var arguments = new object[] { theObject }; var func = requestBuilder.BuildRestResultFuncForMethod("UploadJsonObject", new Type[] { typeof(ModelObject) }); @@ -958,7 +1065,7 @@ public virtual Task UploadJsonObject(ModelObject theObject) } /// - public virtual Task UploadJsonObjects(IEnumerable theObjects) + Task IRunscopeApi.UploadJsonObjects(IEnumerable theObjects) { var arguments = new object[] { theObjects }; var func = requestBuilder.BuildRestResultFuncForMethod("UploadJsonObjects", new Type[] { typeof(IEnumerable) }); @@ -966,7 +1073,7 @@ public virtual Task UploadJsonObjects(IEnumerable - public virtual Task UploadMixedObjects(IEnumerable theObjects,AnotherModel anotherModel,FileInfo aFile,AnEnum anEnum,string aString,int anInt) + Task IRunscopeApi.UploadMixedObjects(IEnumerable theObjects,AnotherModel anotherModel,FileInfo aFile,AnEnum anEnum,string aString,int anInt) { var arguments = new object[] { theObjects,anotherModel,aFile,anEnum,aString,anInt }; var func = requestBuilder.BuildRestResultFuncForMethod("UploadMixedObjects", new Type[] { typeof(IEnumerable),typeof(AnotherModel),typeof(FileInfo),typeof(AnEnum),typeof(string),typeof(int) }); @@ -974,7 +1081,7 @@ public virtual Task UploadMixedObjects(IEnumerable - public virtual Task UploadHttpContent(HttpContent content) + Task IRunscopeApi.UploadHttpContent(HttpContent content) { var arguments = new object[] { content }; var func = requestBuilder.BuildRestResultFuncForMethod("UploadHttpContent", new Type[] { typeof(HttpContent) }); @@ -1005,7 +1112,7 @@ public AutoGeneratedIServiceWithoutNamespace(HttpClient client, IRequestBuilder } /// - public virtual Task GetRoot() + Task IServiceWithoutNamespace.GetRoot() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("GetRoot", new Type[] { }); @@ -1013,7 +1120,7 @@ public virtual Task GetRoot() } /// - public virtual Task PostRoot() + Task IServiceWithoutNamespace.PostRoot() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("PostRoot", new Type[] { }); @@ -1044,7 +1151,7 @@ public AutoGeneratedIStreamApi(HttpClient client, IRequestBuilder requestBuilder } /// - public virtual Task GetRemoteFile(string filename) + Task IStreamApi.GetRemoteFile(string filename) { var arguments = new object[] { filename }; var func = requestBuilder.BuildRestResultFuncForMethod("GetRemoteFile", new Type[] { typeof(string) }); @@ -1052,7 +1159,7 @@ public virtual Task GetRemoteFile(string filename) } /// - public virtual Task> GetRemoteFileWithMetadata(string filename) + Task> IStreamApi.GetRemoteFileWithMetadata(string filename) { var arguments = new object[] { filename }; var func = requestBuilder.BuildRestResultFuncForMethod("GetRemoteFileWithMetadata", new Type[] { typeof(string) }); @@ -1087,7 +1194,7 @@ public AutoGeneratedIUseOverloadedGenericMethods(HttpClient client, IRequestBuil } /// - public virtual Task Get() + Task IUseOverloadedGenericMethods.Get() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("Get", new Type[] { }); @@ -1095,7 +1202,7 @@ public virtual Task Get() } /// - public virtual Task Get(TParam param,THeader header) + Task IUseOverloadedGenericMethods.Get(TParam param,THeader header) { var arguments = new object[] { param,header }; var func = requestBuilder.BuildRestResultFuncForMethod("Get", new Type[] { typeof(TParam),typeof(THeader) }); @@ -1103,7 +1210,7 @@ public virtual Task Get(TParam param,THeader header) } /// - public virtual Task Get(THeader param,TParam header) + Task IUseOverloadedGenericMethods.Get(THeader param,TParam header) { var arguments = new object[] { param,header }; var func = requestBuilder.BuildRestResultFuncForMethod("Get", new Type[] { typeof(THeader),typeof(TParam) }); @@ -1111,7 +1218,7 @@ public virtual Task Get(THeader param,TParam header) } /// - public virtual Task Get(int httpstatuscode) + Task IUseOverloadedGenericMethods.Get(int httpstatuscode) { var arguments = new object[] { httpstatuscode }; var func = requestBuilder.BuildRestResultFuncForMethod("Get", new Type[] { typeof(int) }); @@ -1119,7 +1226,7 @@ public virtual Task Get(int httpstatuscode) } /// - public virtual Task Get(int someVal) + Task IUseOverloadedGenericMethods.Get(int someVal) { var arguments = new object[] { someVal }; var func = requestBuilder.BuildRestResultFuncForMethod("Get", new Type[] { typeof(int) }, new Type[] { typeof(TValue) }); @@ -1127,7 +1234,7 @@ public virtual Task Get(int someVal) } /// - public virtual Task Get(TInput input) + Task IUseOverloadedGenericMethods.Get(TInput input) { var arguments = new object[] { input }; var func = requestBuilder.BuildRestResultFuncForMethod("Get", new Type[] { typeof(TInput) }, new Type[] { typeof(TValue), typeof(TInput) }); @@ -1135,7 +1242,7 @@ public virtual Task Get(TInput input) } /// - public virtual Task Get(TInput1 input1,TInput2 input2) + Task IUseOverloadedGenericMethods.Get(TInput1 input1,TInput2 input2) { var arguments = new object[] { input1,input2 }; var func = requestBuilder.BuildRestResultFuncForMethod("Get", new Type[] { typeof(TInput1),typeof(TInput2) }, new Type[] { typeof(TInput1), typeof(TInput2) }); @@ -1166,7 +1273,7 @@ public AutoGeneratedIUseOverloadedMethods(HttpClient client, IRequestBuilder req } /// - public virtual Task Get() + Task IUseOverloadedMethods.Get() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("Get", new Type[] { }); @@ -1174,7 +1281,7 @@ public virtual Task Get() } /// - public virtual Task Get(int httpstatuscode) + Task IUseOverloadedMethods.Get(int httpstatuscode) { var arguments = new object[] { httpstatuscode }; var func = requestBuilder.BuildRestResultFuncForMethod("Get", new Type[] { typeof(int) }); From b68a55d048be15a7347037f4a5422bcde91e54c1 Mon Sep 17 00:00:00 2001 From: Sergio Pedri Date: Thu, 7 Mar 2019 18:06:00 +0100 Subject: [PATCH 09/12] Fixed merge issues --- Refit.Tests/RefitStubs.Net46.cs | 35 +++++++++++++++------------ Refit.Tests/RefitStubs.NetCore2.cs | 35 +++++++++++++++------------ Refit/RequestBuilderImplementation.cs | 8 +++--- 3 files changed, 45 insertions(+), 33 deletions(-) diff --git a/Refit.Tests/RefitStubs.Net46.cs b/Refit.Tests/RefitStubs.Net46.cs index 08f37fffd..f3d0ad3d3 100644 --- a/Refit.Tests/RefitStubs.Net46.cs +++ b/Refit.Tests/RefitStubs.Net46.cs @@ -158,7 +158,9 @@ namespace Refit.Tests [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] [global::System.Diagnostics.DebuggerNonUserCode] [Preserve] - partial class AutoGeneratedIAmInterfaceA : IAmInterfaceA { + [global::System.Reflection.Obfuscation(Exclude=true)] + partial class AutoGeneratedIAmInterfaceA : IAmInterfaceA + { /// public HttpClient Client { get; protected set; } readonly IRequestBuilder requestBuilder; @@ -177,7 +179,6 @@ Task IAmInterfaceA.Ping() var func = requestBuilder.BuildRestResultFuncForMethod("Ping", new Type[] { }); return (Task)func(Client, arguments); } - } } @@ -186,10 +187,12 @@ namespace Refit.Tests using Refit.Tests.RefitInternalGenerated; /// - [ExcludeFromCodeCoverage] - [DebuggerNonUserCode] + [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] + [global::System.Diagnostics.DebuggerNonUserCode] [Preserve] - partial class AutoGeneratedIAmInterfaceB : IAmInterfaceB { + [global::System.Reflection.Obfuscation(Exclude=true)] + partial class AutoGeneratedIAmInterfaceB : IAmInterfaceB + { /// public HttpClient Client { get; protected set; } readonly IRequestBuilder requestBuilder; @@ -208,7 +211,6 @@ Task IAmInterfaceB.Pong() var func = requestBuilder.BuildRestResultFuncForMethod("Pong", new Type[] { }); return (Task)func(Client, arguments); } - } } @@ -217,10 +219,12 @@ namespace Refit.Tests using Refit.Tests.RefitInternalGenerated; /// - [ExcludeFromCodeCoverage] - [DebuggerNonUserCode] + [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] + [global::System.Diagnostics.DebuggerNonUserCode] [Preserve] - partial class AutoGeneratedIAmInterfaceC : IAmInterfaceC { + [global::System.Reflection.Obfuscation(Exclude=true)] + partial class AutoGeneratedIAmInterfaceC : IAmInterfaceC + { /// public HttpClient Client { get; protected set; } readonly IRequestBuilder requestBuilder; @@ -255,7 +259,6 @@ Task IAmInterfaceB.Pong() var func = requestBuilder.BuildRestResultFuncForMethod("Pong", new Type[] { }); return (Task)func(Client, arguments); } - } } @@ -264,10 +267,12 @@ namespace Refit.Tests using Refit.Tests.RefitInternalGenerated; /// - [ExcludeFromCodeCoverage] - [DebuggerNonUserCode] + [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] + [global::System.Diagnostics.DebuggerNonUserCode] [Preserve] - partial class AutoGeneratedIApiWithDecimal : IApiWithDecimal { + [global::System.Reflection.Obfuscation(Exclude=true)] + partial class AutoGeneratedIApiWithDecimal : IApiWithDecimal + { /// public HttpClient Client { get; protected set; } readonly IRequestBuilder requestBuilder; @@ -1207,7 +1212,7 @@ public AutoGeneratedITrimTrailingForwardSlashApi(HttpClient client, IRequestBuil } /// - public virtual Task Get() + Task ITrimTrailingForwardSlashApi.Get() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("Get", new Type[] { }); @@ -1363,7 +1368,7 @@ public AutoGeneratedIValidApi(HttpClient client, IRequestBuilder requestBuilder) } /// - public virtual Task Get() + Task IValidApi.Get() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("Get", new Type[] { }); diff --git a/Refit.Tests/RefitStubs.NetCore2.cs b/Refit.Tests/RefitStubs.NetCore2.cs index 08f37fffd..f3d0ad3d3 100644 --- a/Refit.Tests/RefitStubs.NetCore2.cs +++ b/Refit.Tests/RefitStubs.NetCore2.cs @@ -158,7 +158,9 @@ namespace Refit.Tests [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] [global::System.Diagnostics.DebuggerNonUserCode] [Preserve] - partial class AutoGeneratedIAmInterfaceA : IAmInterfaceA { + [global::System.Reflection.Obfuscation(Exclude=true)] + partial class AutoGeneratedIAmInterfaceA : IAmInterfaceA + { /// public HttpClient Client { get; protected set; } readonly IRequestBuilder requestBuilder; @@ -177,7 +179,6 @@ Task IAmInterfaceA.Ping() var func = requestBuilder.BuildRestResultFuncForMethod("Ping", new Type[] { }); return (Task)func(Client, arguments); } - } } @@ -186,10 +187,12 @@ namespace Refit.Tests using Refit.Tests.RefitInternalGenerated; /// - [ExcludeFromCodeCoverage] - [DebuggerNonUserCode] + [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] + [global::System.Diagnostics.DebuggerNonUserCode] [Preserve] - partial class AutoGeneratedIAmInterfaceB : IAmInterfaceB { + [global::System.Reflection.Obfuscation(Exclude=true)] + partial class AutoGeneratedIAmInterfaceB : IAmInterfaceB + { /// public HttpClient Client { get; protected set; } readonly IRequestBuilder requestBuilder; @@ -208,7 +211,6 @@ Task IAmInterfaceB.Pong() var func = requestBuilder.BuildRestResultFuncForMethod("Pong", new Type[] { }); return (Task)func(Client, arguments); } - } } @@ -217,10 +219,12 @@ namespace Refit.Tests using Refit.Tests.RefitInternalGenerated; /// - [ExcludeFromCodeCoverage] - [DebuggerNonUserCode] + [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] + [global::System.Diagnostics.DebuggerNonUserCode] [Preserve] - partial class AutoGeneratedIAmInterfaceC : IAmInterfaceC { + [global::System.Reflection.Obfuscation(Exclude=true)] + partial class AutoGeneratedIAmInterfaceC : IAmInterfaceC + { /// public HttpClient Client { get; protected set; } readonly IRequestBuilder requestBuilder; @@ -255,7 +259,6 @@ Task IAmInterfaceB.Pong() var func = requestBuilder.BuildRestResultFuncForMethod("Pong", new Type[] { }); return (Task)func(Client, arguments); } - } } @@ -264,10 +267,12 @@ namespace Refit.Tests using Refit.Tests.RefitInternalGenerated; /// - [ExcludeFromCodeCoverage] - [DebuggerNonUserCode] + [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] + [global::System.Diagnostics.DebuggerNonUserCode] [Preserve] - partial class AutoGeneratedIApiWithDecimal : IApiWithDecimal { + [global::System.Reflection.Obfuscation(Exclude=true)] + partial class AutoGeneratedIApiWithDecimal : IApiWithDecimal + { /// public HttpClient Client { get; protected set; } readonly IRequestBuilder requestBuilder; @@ -1207,7 +1212,7 @@ public AutoGeneratedITrimTrailingForwardSlashApi(HttpClient client, IRequestBuil } /// - public virtual Task Get() + Task ITrimTrailingForwardSlashApi.Get() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("Get", new Type[] { }); @@ -1363,7 +1368,7 @@ public AutoGeneratedIValidApi(HttpClient client, IRequestBuilder requestBuilder) } /// - public virtual Task Get() + Task IValidApi.Get() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("Get", new Type[] { }); diff --git a/Refit/RequestBuilderImplementation.cs b/Refit/RequestBuilderImplementation.cs index 2c4b09690..3615e2b9e 100644 --- a/Refit/RequestBuilderImplementation.cs +++ b/Refit/RequestBuilderImplementation.cs @@ -46,7 +46,8 @@ public RequestBuilderImplementation(RefitSettings refitSettings = null) var dict = new Dictionary>(); - foreach (var methodInfo in targetInterface.GetMethods()) + AddInterfaceHttpMethods(targetInterface, dict); + foreach (var inheritedInterface in targetInterfaceInheritedInterfaces) { AddInterfaceHttpMethods(inheritedInterface, dict); } @@ -56,12 +57,13 @@ public RequestBuilderImplementation(RefitSettings refitSettings = null) private void AddInterfaceHttpMethods(Type interfaceType, Dictionary> methods) { - foreach (var methodInfo in interfaceType.GetMethods()) { + foreach (var methodInfo in interfaceType.GetMethods()) + { var attrs = methodInfo.GetCustomAttributes(true); var hasHttpMethod = attrs.OfType().Any(); if (hasHttpMethod) { - if (!dict.ContainsKey(methodInfo.Name)) + if (!methods.ContainsKey(methodInfo.Name)) { methods.Add(methodInfo.Name, new List()); } From 814d70034ef76fab1e185680d5a61a65ae1fff58 Mon Sep 17 00:00:00 2001 From: Sergio Pedri Date: Tue, 12 Mar 2019 16:01:35 +0100 Subject: [PATCH 10/12] Added header attributes inheritance --- Refit/RestMethodInfo.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Refit/RestMethodInfo.cs b/Refit/RestMethodInfo.cs index 16903b2a9..429d084da 100644 --- a/Refit/RestMethodInfo.cs +++ b/Refit/RestMethodInfo.cs @@ -242,6 +242,10 @@ Dictionary ParseHeaders(MethodInfo methodInfo) { var ret = new Dictionary(); + var inheritedAttributes = methodInfo.DeclaringType != null + ? methodInfo.DeclaringType.GetInterfaces().SelectMany(i => i.GetTypeInfo().GetCustomAttributes(true)).Reverse() + : new Attribute[0]; + var declaringTypeAttributes = methodInfo.DeclaringType != null ? methodInfo.DeclaringType.GetTypeInfo().GetCustomAttributes(true) : new Attribute[0]; @@ -249,7 +253,7 @@ Dictionary ParseHeaders(MethodInfo methodInfo) // Headers set on the declaring type have to come first, // so headers set on the method can replace them. Switching // the order here will break stuff. - var headers = declaringTypeAttributes.Concat(methodInfo.GetCustomAttributes(true)) + var headers = inheritedAttributes.Concat(declaringTypeAttributes).Concat(methodInfo.GetCustomAttributes(true)) .OfType() .SelectMany(ha => ha.Headers); From 0814d0d3be62335c9d2507a933fe7e695584b92b Mon Sep 17 00:00:00 2001 From: Sergio Pedri Date: Tue, 12 Mar 2019 16:05:11 +0100 Subject: [PATCH 11/12] Added interface inheritance docs --- README.md | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/README.md b/README.md index 0945a7196..a59db0ee7 100644 --- a/README.md +++ b/README.md @@ -633,6 +633,64 @@ Which can be used like this: // than one type (unless you have a different domain for each type) var api = RestService.For>("http://api.example.com/users"); ``` +### Interface inheritance + +When writing APIs for a web service that supports authentication, it might be useful to have two separate services to perform authorized and unauthorized calls, since a different connection method might be required (eg. the authenticated service might need to set additional headers or access tokens behind the scenes). While the authorized service will expose additional APIs only available to logged in users, the two services might still share a good amount of available APIs. +In this case, instead of redefining all of those in two separate interfaces, it's possible to use inheritance to make the code more compact: + +```csharp +public interface IUnauthenticatedClient +{ + [Get("/resources")] + Task GetResource(string id); +} + +public interface IAuthenticatedClient : IUnauthenticatedClient +{ + [Post("/resources")] + Task AddResource([Body] Resource resource); +} +``` + +Doing so, the `IAuthenticatedClient` will expose both the `GetResource` and `AddResource` APIs. + +#### Headers inheritance + +When using inheritance, existing header attributes will passed along as well, and the inner-most ones will have precedence: + +```csharp +[Headers("User-Agent: AAA")] +public interface IAmInterfaceA +{ + [Get("/get?result=Ping")] + Task Ping(); +} + +[Headers("User-Agent: BBB")] +public interface IAmInterfaceB : IAmInterfaceA +{ + [Get("/get?result=Pang")] + [Headers("User-Agent: PANG")] + Task Pang(); + + [Get("/get?result=Foo")] + Task Foo(); +} +``` + +Here, `IAmInterfaceB.Pang()` will use `PANG` as its user agent, while `IAmInterfaceB.Foo` and `IAmInterfaceB.Ping` will use `BBB`. +Note that if `IAmInterfaceB` didn't have a header attribute, `Foo` would then use the `AAA` value inherited from `IAmInterfaceA`. +If an interface is inheriting more than one interface, the order of precedence is the same as the one in which the inherited interfaces are declared: + +```csharp +public interface IAmInterfaceC : IAmInterfaceA, IAmInterfaceB +{ + [Get("/get?result=Foo")] + Task Foo(); +} +``` + +Here `IAmInterfaceC.Foo` would use the header attribute inherited from `IAmInterfaceA`, if present, or the one inherited from `IAmInterfaceB`, and so on for all the declared interfaces. ### Using HttpClientFactory From 199dedf10c802a8c610d06917625a5ad8853987f Mon Sep 17 00:00:00 2001 From: Sergio Pedri Date: Tue, 12 Mar 2019 19:56:07 +0100 Subject: [PATCH 12/12] Tweaked README.md --- README.md | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index a59db0ee7..cb900d36c 100644 --- a/README.md +++ b/README.md @@ -635,24 +635,29 @@ var api = RestService.For>("http://api.exam ``` ### Interface inheritance -When writing APIs for a web service that supports authentication, it might be useful to have two separate services to perform authorized and unauthorized calls, since a different connection method might be required (eg. the authenticated service might need to set additional headers or access tokens behind the scenes). While the authorized service will expose additional APIs only available to logged in users, the two services might still share a good amount of available APIs. -In this case, instead of redefining all of those in two separate interfaces, it's possible to use inheritance to make the code more compact: +When multiple services that need to be kept separate share a number of APIs, it is possible to leverage interface inheritance to avoid having to define the same Refit methods multiple times in different services: ```csharp -public interface IUnauthenticatedClient +public interface IBaseService { [Get("/resources")] Task GetResource(string id); } -public interface IAuthenticatedClient : IUnauthenticatedClient +public interface IDerivedServiceA : IBaseService +{ + [Delete("/resources")] + Task DeleteResource(string id); +} + +public interface IDerivedServiceB : IBaseService { [Post("/resources")] Task AddResource([Body] Resource resource); } ``` -Doing so, the `IAuthenticatedClient` will expose both the `GetResource` and `AddResource` APIs. +In this example, the `IDerivedServiceA` interface will expose both the `GetResource` and `DeleteResource` APIs, while `IDerivedServiceB` will expose `GetResource` and `AddResource`. #### Headers inheritance