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 diff --git a/InterfaceStubGenerator.Core/GeneratedInterfaceStubTemplate.mustache b/InterfaceStubGenerator.Core/GeneratedInterfaceStubTemplate.mustache index 3b458f4cc..c1780e617 100644 --- a/InterfaceStubGenerator.Core/GeneratedInterfaceStubTemplate.mustache +++ b/InterfaceStubGenerator.Core/GeneratedInterfaceStubTemplate.mustache @@ -61,11 +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 ff5444e08..c7bc907db 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; @@ -92,6 +91,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(); var ns = parent as NamespaceDeclarationSyntax; ret.Namespace = ns?.Name?.ToString() ?? $"AutoGenerated{ret.GeneratedClassSuffix}"; @@ -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; }) @@ -181,9 +182,20 @@ 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); + } + } + public void GenerateWarnings(List interfacesToGenerate) { var missingAttributeWarnings = interfacesToGenerate @@ -240,6 +252,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; } @@ -255,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/README.md b/README.md index 60b16a79e..9ac783073 100644 --- a/README.md +++ b/README.md @@ -633,6 +633,69 @@ 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 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 IBaseService +{ + [Get("/resources")] + Task GetResource(string id); +} + +public interface IDerivedServiceA : IBaseService +{ + [Delete("/resources")] + Task DeleteResource(string id); +} + +public interface IDerivedServiceB : IBaseService +{ + [Post("/resources")] + Task AddResource([Body] Resource resource); +} +``` + +In this example, the `IDerivedServiceA` interface will expose both the `GetResource` and `DeleteResource` APIs, while `IDerivedServiceB` will expose `GetResource` and `AddResource`. + +#### 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 diff --git a/Refit.Tests/InheritedInterfacesApi.cs b/Refit.Tests/InheritedInterfacesApi.cs new file mode 100644 index 000000000..24a7c46b2 --- /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("/get?result=Ping")] + Task Ping(); + } + + [Headers("User-Agent: Refit Integration Tests")] + public interface IAmInterfaceB + { + [Get("/get?result=Pong")] + Task Pong(); + } + + [Headers("User-Agent: Refit Integration Tests")] + public interface IAmInterfaceC : IAmInterfaceB, IAmInterfaceA + { + [Get("/get?result=Pang")] + Task Pang(); + } +} diff --git a/Refit.Tests/InterfaceStubGenerator.cs b/Refit.Tests/InterfaceStubGenerator.cs index 1b6a62bac..479852da3 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] @@ -126,6 +128,32 @@ public void GenerateTemplateInfoForInterfaceListSmokeTest() Assert.Equal(12, 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() { diff --git a/Refit.Tests/RefitStubs.Net46.cs b/Refit.Tests/RefitStubs.Net46.cs index fda73a626..f3d0ad3d3 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) }); @@ -135,7 +135,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[] { }); @@ -143,13 +143,125 @@ 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."); } } } +namespace Refit.Tests +{ + using Refit.Tests.RefitInternalGenerated; + + /// + [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] + [global::System.Diagnostics.DebuggerNonUserCode] + [Preserve] + [global::System.Reflection.Obfuscation(Exclude=true)] + 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; + + /// + [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] + [global::System.Diagnostics.DebuggerNonUserCode] + [Preserve] + [global::System.Reflection.Obfuscation(Exclude=true)] + 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; + + /// + [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] + [global::System.Diagnostics.DebuggerNonUserCode] + [Preserve] + [global::System.Reflection.Obfuscation(Exclude=true)] + 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; @@ -173,7 +285,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) }); @@ -205,7 +317,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[] { }); @@ -213,7 +325,7 @@ public virtual Task Post() } /// - public virtual Task Get() + Task IBodylessApi.Get() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("Get", new Type[] { }); @@ -221,7 +333,7 @@ public virtual Task Get() } /// - public virtual Task Head() + Task IBodylessApi.Head() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("Head", new Type[] { }); @@ -256,7 +368,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) }); @@ -264,7 +376,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[] { }); @@ -272,7 +384,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) }); @@ -280,7 +392,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) }); @@ -288,7 +400,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) }); @@ -320,7 +432,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) }); @@ -352,7 +464,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) }); @@ -360,7 +472,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) }); @@ -368,7 +480,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) }); @@ -376,7 +488,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) }); @@ -384,7 +496,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) }); @@ -392,7 +504,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[] { }); @@ -400,7 +512,7 @@ public virtual Task GetIndex() } /// - public virtual IObservable GetIndexObservable() + IObservable IGitHubApi.GetIndexObservable() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("GetIndexObservable", new Type[] { }); @@ -408,7 +520,7 @@ public virtual IObservable GetIndexObservable() } /// - public virtual Task NothingToSeeHere() + Task IGitHubApi.NothingToSeeHere() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("NothingToSeeHere", new Type[] { }); @@ -416,7 +528,7 @@ public virtual Task NothingToSeeHere() } /// - public virtual Task> NothingToSeeHereWithMetadata() + Task> IGitHubApi.NothingToSeeHereWithMetadata() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("NothingToSeeHereWithMetadata", new Type[] { }); @@ -424,7 +536,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) }); @@ -432,7 +544,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) }); @@ -440,7 +552,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) }); @@ -448,7 +560,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) }); @@ -484,7 +596,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) }); @@ -492,7 +604,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) }); @@ -500,7 +612,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) }); @@ -508,8 +620,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) }); @@ -541,7 +652,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) }); @@ -549,7 +660,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) }); @@ -581,7 +692,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[] { }); @@ -613,7 +724,7 @@ public AutoGeneratedAuthenticatedClientHandlerTestsIMyAuthenticatedService(HttpC } /// - public virtual Task GetUnauthenticated() + Task AuthenticatedClientHandlerTests.IMyAuthenticatedService.GetUnauthenticated() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("GetUnauthenticated", new Type[] { }); @@ -621,7 +732,7 @@ public virtual Task GetUnauthenticated() } /// - public virtual Task GetAuthenticated() + Task AuthenticatedClientHandlerTests.IMyAuthenticatedService.GetAuthenticated() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("GetAuthenticated", new Type[] { }); @@ -653,7 +764,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[] { }); @@ -685,7 +796,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) }); @@ -693,7 +804,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) }); @@ -701,7 +812,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) }); @@ -709,7 +820,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) }); @@ -717,7 +828,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) }); @@ -725,7 +836,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[] { }); @@ -733,7 +844,7 @@ public virtual Task GetIndex() } /// - public virtual IObservable GetIndexObservable() + IObservable TestNested.INestedGitHubApi.GetIndexObservable() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("GetIndexObservable", new Type[] { }); @@ -741,7 +852,7 @@ public virtual IObservable GetIndexObservable() } /// - public virtual Task NothingToSeeHere() + Task TestNested.INestedGitHubApi.NothingToSeeHere() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("NothingToSeeHere", new Type[] { }); @@ -773,9 +884,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) }); @@ -783,9 +892,7 @@ public virtual Task PostMessage } /// - 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) }); @@ -817,7 +924,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[] { }); @@ -849,7 +956,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[] { }); @@ -857,7 +964,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) }); @@ -865,7 +972,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) }); @@ -873,7 +980,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) }); @@ -881,8 +988,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) }); @@ -914,7 +1020,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) }); @@ -922,7 +1028,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) }); @@ -930,7 +1036,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[]) }); @@ -938,7 +1044,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) }); @@ -946,7 +1052,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) }); @@ -954,7 +1060,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) }); @@ -962,7 +1068,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) }); @@ -970,7 +1076,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) }); @@ -978,7 +1084,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) }); @@ -986,7 +1092,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) }); @@ -994,7 +1100,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) }); @@ -1026,7 +1132,7 @@ public AutoGeneratedIServiceWithoutNamespace(HttpClient client, IRequestBuilder } /// - public virtual Task GetRoot() + Task IServiceWithoutNamespace.GetRoot() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("GetRoot", new Type[] { }); @@ -1034,7 +1140,7 @@ public virtual Task GetRoot() } /// - public virtual Task PostRoot() + Task IServiceWithoutNamespace.PostRoot() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("PostRoot", new Type[] { }); @@ -1066,7 +1172,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) }); @@ -1074,7 +1180,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) }); @@ -1106,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[] { }); @@ -1142,7 +1248,7 @@ public AutoGeneratedIUseOverloadedGenericMethods(HttpClient client, IRequestBuil } /// - public virtual Task Get() + Task IUseOverloadedGenericMethods.Get() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("Get", new Type[] { }); @@ -1150,7 +1256,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) }); @@ -1158,7 +1264,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) }); @@ -1166,7 +1272,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) }); @@ -1174,8 +1280,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) }); @@ -1183,8 +1288,7 @@ public virtual Task Get } /// - 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) }); @@ -1192,8 +1296,7 @@ public virtual Task Get } /// - 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) }); @@ -1225,7 +1328,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[] { }); @@ -1233,7 +1336,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) }); @@ -1265,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 fda73a626..f3d0ad3d3 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) }); @@ -135,7 +135,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[] { }); @@ -143,13 +143,125 @@ 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."); } } } +namespace Refit.Tests +{ + using Refit.Tests.RefitInternalGenerated; + + /// + [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] + [global::System.Diagnostics.DebuggerNonUserCode] + [Preserve] + [global::System.Reflection.Obfuscation(Exclude=true)] + 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; + + /// + [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] + [global::System.Diagnostics.DebuggerNonUserCode] + [Preserve] + [global::System.Reflection.Obfuscation(Exclude=true)] + 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; + + /// + [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] + [global::System.Diagnostics.DebuggerNonUserCode] + [Preserve] + [global::System.Reflection.Obfuscation(Exclude=true)] + 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; @@ -173,7 +285,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) }); @@ -205,7 +317,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[] { }); @@ -213,7 +325,7 @@ public virtual Task Post() } /// - public virtual Task Get() + Task IBodylessApi.Get() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("Get", new Type[] { }); @@ -221,7 +333,7 @@ public virtual Task Get() } /// - public virtual Task Head() + Task IBodylessApi.Head() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("Head", new Type[] { }); @@ -256,7 +368,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) }); @@ -264,7 +376,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[] { }); @@ -272,7 +384,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) }); @@ -280,7 +392,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) }); @@ -288,7 +400,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) }); @@ -320,7 +432,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) }); @@ -352,7 +464,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) }); @@ -360,7 +472,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) }); @@ -368,7 +480,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) }); @@ -376,7 +488,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) }); @@ -384,7 +496,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) }); @@ -392,7 +504,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[] { }); @@ -400,7 +512,7 @@ public virtual Task GetIndex() } /// - public virtual IObservable GetIndexObservable() + IObservable IGitHubApi.GetIndexObservable() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("GetIndexObservable", new Type[] { }); @@ -408,7 +520,7 @@ public virtual IObservable GetIndexObservable() } /// - public virtual Task NothingToSeeHere() + Task IGitHubApi.NothingToSeeHere() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("NothingToSeeHere", new Type[] { }); @@ -416,7 +528,7 @@ public virtual Task NothingToSeeHere() } /// - public virtual Task> NothingToSeeHereWithMetadata() + Task> IGitHubApi.NothingToSeeHereWithMetadata() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("NothingToSeeHereWithMetadata", new Type[] { }); @@ -424,7 +536,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) }); @@ -432,7 +544,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) }); @@ -440,7 +552,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) }); @@ -448,7 +560,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) }); @@ -484,7 +596,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) }); @@ -492,7 +604,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) }); @@ -500,7 +612,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) }); @@ -508,8 +620,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) }); @@ -541,7 +652,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) }); @@ -549,7 +660,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) }); @@ -581,7 +692,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[] { }); @@ -613,7 +724,7 @@ public AutoGeneratedAuthenticatedClientHandlerTestsIMyAuthenticatedService(HttpC } /// - public virtual Task GetUnauthenticated() + Task AuthenticatedClientHandlerTests.IMyAuthenticatedService.GetUnauthenticated() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("GetUnauthenticated", new Type[] { }); @@ -621,7 +732,7 @@ public virtual Task GetUnauthenticated() } /// - public virtual Task GetAuthenticated() + Task AuthenticatedClientHandlerTests.IMyAuthenticatedService.GetAuthenticated() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("GetAuthenticated", new Type[] { }); @@ -653,7 +764,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[] { }); @@ -685,7 +796,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) }); @@ -693,7 +804,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) }); @@ -701,7 +812,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) }); @@ -709,7 +820,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) }); @@ -717,7 +828,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) }); @@ -725,7 +836,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[] { }); @@ -733,7 +844,7 @@ public virtual Task GetIndex() } /// - public virtual IObservable GetIndexObservable() + IObservable TestNested.INestedGitHubApi.GetIndexObservable() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("GetIndexObservable", new Type[] { }); @@ -741,7 +852,7 @@ public virtual IObservable GetIndexObservable() } /// - public virtual Task NothingToSeeHere() + Task TestNested.INestedGitHubApi.NothingToSeeHere() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("NothingToSeeHere", new Type[] { }); @@ -773,9 +884,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) }); @@ -783,9 +892,7 @@ public virtual Task PostMessage } /// - 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) }); @@ -817,7 +924,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[] { }); @@ -849,7 +956,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[] { }); @@ -857,7 +964,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) }); @@ -865,7 +972,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) }); @@ -873,7 +980,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) }); @@ -881,8 +988,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) }); @@ -914,7 +1020,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) }); @@ -922,7 +1028,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) }); @@ -930,7 +1036,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[]) }); @@ -938,7 +1044,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) }); @@ -946,7 +1052,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) }); @@ -954,7 +1060,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) }); @@ -962,7 +1068,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) }); @@ -970,7 +1076,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) }); @@ -978,7 +1084,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) }); @@ -986,7 +1092,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) }); @@ -994,7 +1100,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) }); @@ -1026,7 +1132,7 @@ public AutoGeneratedIServiceWithoutNamespace(HttpClient client, IRequestBuilder } /// - public virtual Task GetRoot() + Task IServiceWithoutNamespace.GetRoot() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("GetRoot", new Type[] { }); @@ -1034,7 +1140,7 @@ public virtual Task GetRoot() } /// - public virtual Task PostRoot() + Task IServiceWithoutNamespace.PostRoot() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("PostRoot", new Type[] { }); @@ -1066,7 +1172,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) }); @@ -1074,7 +1180,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) }); @@ -1106,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[] { }); @@ -1142,7 +1248,7 @@ public AutoGeneratedIUseOverloadedGenericMethods(HttpClient client, IRequestBuil } /// - public virtual Task Get() + Task IUseOverloadedGenericMethods.Get() { var arguments = new object[] { }; var func = requestBuilder.BuildRestResultFuncForMethod("Get", new Type[] { }); @@ -1150,7 +1256,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) }); @@ -1158,7 +1264,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) }); @@ -1166,7 +1272,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) }); @@ -1174,8 +1280,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) }); @@ -1183,8 +1288,7 @@ public virtual Task Get } /// - 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) }); @@ -1192,8 +1296,7 @@ public virtual Task Get } /// - 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) }); @@ -1225,7 +1328,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[] { }); @@ -1233,7 +1336,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) }); @@ -1265,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/RestService.cs b/Refit.Tests/RestService.cs index 710f8a250..ab8da5111 100644 --- a/Refit.Tests/RestService.cs +++ b/Refit.Tests/RestService.cs @@ -1069,6 +1069,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() { diff --git a/Refit/RequestBuilderImplementation.cs b/Refit/RequestBuilderImplementation.cs index 1e96d9650..3615e2b9e 100644 --- a/Refit/RequestBuilderImplementation.cs +++ b/Refit/RequestBuilderImplementation.cs @@ -31,6 +31,7 @@ partial class RequestBuilderImplementation : IRequestBuilder public RequestBuilderImplementation(RefitSettings refitSettings = null) { Type targetInterface = typeof(TApi); + Type[] targetInterfaceInheritedInterfaces = targetInterface.GetInterfaces(); settings = refitSettings ?? new RefitSettings(); serializer = settings.ContentSerializer; @@ -42,24 +43,35 @@ 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)) + if (!methods.ContainsKey(methodInfo.Name)) { - dict.Add(methodInfo.Name, new List()); + 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) 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);