Skip to content

Commit 6a04e8d

Browse files
committed
解决由于Type.GetMethods()返回的MethodInfo顺序不固定而影响接口代理类的拦截问题
1 parent 4bc207f commit 6a04e8d

File tree

6 files changed

+104
-4
lines changed

6 files changed

+104
-4
lines changed
1 KB
Binary file not shown.
512 Bytes
Binary file not shown.

WebApiClient.BuildTask/CeInterface.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,11 @@ public MethodDefinition[] GetAllApis()
143143
.Except(excepts, TypeDefinitionComparer.Instance)
144144
.ToArray();
145145

146-
var apiMethods = interfaces.SelectMany(item => item.Methods).ToArray();
146+
var apiMethods = interfaces
147+
.SelectMany(item => item.Methods)
148+
.OrderBy(item => base.GetMethodFullName(item))
149+
.ToArray();
150+
147151
foreach (var method in apiMethods)
148152
{
149153
this.EnsureApiMethod(method);

WebApiClient.BuildTask/CeMetadata.cs

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System;
33
using System.Linq;
44
using System.Reflection;
5+
using System.Text;
56

67
namespace WebApiClient.BuildTask
78
{
@@ -140,5 +141,51 @@ protected bool IsTypeEquals(TypeReference source, Type target)
140141
}
141142
return source.FullName == target.FullName;
142143
}
144+
145+
/// <summary>
146+
/// 返回方法的完整名称
147+
/// </summary>
148+
/// <param name="method">方法</param>
149+
/// <returns></returns>
150+
protected string GetMethodFullName(MethodReference method)
151+
{
152+
var builder = new StringBuilder();
153+
foreach (var p in method.Parameters)
154+
{
155+
if (builder.Length > 0)
156+
{
157+
builder.Append(",");
158+
}
159+
builder.Append(GetTypeName(p.ParameterType));
160+
}
161+
var insert = $"{GetTypeName(method.ReturnType)} {method.Name}(";
162+
return builder.Insert(0, insert).Append(")").ToString();
163+
}
164+
165+
/// <summary>
166+
/// 返回类型不含namespace的名称
167+
/// </summary>
168+
/// <param name="type">类型</param>
169+
/// <returns></returns>
170+
private static string GetTypeName(TypeReference type)
171+
{
172+
if (type.IsGenericInstance == false)
173+
{
174+
return type.Name;
175+
}
176+
177+
var builder = new StringBuilder();
178+
var parameters = ((GenericInstanceType)type).GenericArguments;
179+
foreach (var p in parameters)
180+
{
181+
if (builder.Length > 0)
182+
{
183+
builder.Append(",");
184+
}
185+
builder.Append(GetTypeName(p));
186+
}
187+
188+
return builder.Insert(0, $"{type.Name}<").Append(">").ToString();
189+
}
143190
}
144191
}

WebApiClient.BuildTask/WebApiClient.BuildTask.csproj

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44
<OutputType>Library</OutputType>
55
<TargetFrameworks>net45;netcoreapp1.1;</TargetFrameworks>
66
<Configurations>AOT_Debug;AOT_Release</Configurations>
7-
<Version>0.1.3</Version>
8-
<AssemblyVersion>0.1.3.0</AssemblyVersion>
7+
<Version>0.1.4</Version>
8+
<AssemblyVersion>0.1.4.0</AssemblyVersion>
99
<SignAssembly>true</SignAssembly>
1010
<AssemblyOriginatorKeyFile>sign.snk</AssemblyOriginatorKeyFile>
1111
</PropertyGroup>
@@ -35,7 +35,7 @@
3535
<Compile Include="..\WebApiClient\IApiInterceptor.cs" Link="OuterTypes\IApiInterceptor.cs" />
3636
<Compile Include="..\WebApiClient\IHttpApi.cs" Link="OuterTypes\IHttpApi.cs" />
3737
<Compile Include="..\WebApiClient\IHttpApiClient.cs" Link="OuterTypes\IHttpApiClient.cs" />
38-
<Compile Include="..\WebApiClient\ITask.cs" Link="OuterTypes\ITask.cs" />
38+
<Compile Include="..\WebApiClient\ITask.cs" Link="OuterTypes\ITask.cs" />
3939
</ItemGroup>
4040

4141
<Target Name="Print" AfterTargets="AfterBuild">

WebApiClient/Internal/TypeExtend.cs

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using System.Linq;
33
using System.Reflection;
4+
using System.Text;
45
using System.Threading.Tasks;
56
using WebApiClient.DataAnnotations;
67

@@ -57,6 +58,7 @@ private static MethodInfo[] GetAllApiMethodsNoCache(this Type interfaceType)
5758
#if JIT
5859
.Select(item => item.EnsureApiMethod())
5960
#endif
61+
.OrderBy(item => item.GetFullName())
6062
.ToArray();
6163

6264
return apiMethods;
@@ -172,5 +174,52 @@ public static bool IsDefinedFormatScope<T>(this MemberInfo element, FormatScope
172174
var attribute = element.GetCustomAttribute<T>();
173175
return attribute != null && attribute.IsDefinedScope(scope);
174176
}
177+
178+
/// <summary>
179+
/// 返回方法的完整名称
180+
/// </summary>
181+
/// <param name="method">方法</param>
182+
/// <returns></returns>
183+
private static string GetFullName(this MethodInfo method)
184+
{
185+
var builder = new StringBuilder();
186+
foreach (var p in method.GetParameters())
187+
{
188+
if (builder.Length > 0)
189+
{
190+
builder.Append(",");
191+
}
192+
builder.Append(p.ParameterType.GetName());
193+
}
194+
195+
var insert = $"{method.ReturnType.GetName()} {method.Name}(";
196+
return builder.Insert(0, insert).Append(")").ToString();
197+
}
198+
199+
/// <summary>
200+
/// 返回类型不含namespace的名称
201+
/// </summary>
202+
/// <param name="type">类型</param>
203+
/// <returns></returns>
204+
private static string GetName(this Type type)
205+
{
206+
if (type.GetTypeInfo().IsGenericType == false)
207+
{
208+
return type.Name;
209+
}
210+
211+
var builder = new StringBuilder();
212+
foreach (var argType in type.GetGenericArguments())
213+
{
214+
if (builder.Length > 0)
215+
{
216+
builder.Append(",");
217+
}
218+
builder.Append(argType.GetName());
219+
}
220+
221+
return builder.Insert(0, $"{type.Name}<").Append(">").ToString();
222+
}
223+
175224
}
176225
}

0 commit comments

Comments
 (0)