Skip to content

Commit 8b92ee3

Browse files
committed
修复接口继承时获取方法特性和过滤器的问题
1 parent 7f2be64 commit 8b92ee3

File tree

4 files changed

+47
-33
lines changed

4 files changed

+47
-33
lines changed

WebApiClientCore.Test/BuildinExtensions/AttributeExtensionsTest.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,8 @@ public void GetAttributesTest()
5050
var m1 = typeof(D1).GetMethod("M1");
5151
var m2 = typeof(D1).GetMethod("M2");
5252

53-
Assert.True(m1.GetAttributes<MyAttribute>(true).Count() == 0);
54-
Assert.True(m2.GetAttributes<MyAttribute>(true).Count() == 1);
53+
Assert.True(m1.GetAttributes<MyAttribute>().Count() == 0);
54+
Assert.True(m2.GetAttributes<MyAttribute>().Count() == 1);
5555
}
5656
}
5757
}

WebApiClientCore/ApiActionDescriptor.cs

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -83,23 +83,18 @@ public ApiActionDescriptor(MethodInfo method, Type? interfaceType = default)
8383
{
8484
interfaceType = method.DeclaringType;
8585
}
86-
87-
var methodAttributes = method.GetAttributes<IApiActionAttribute>(false);
88-
var interfaceAttributes = interfaceType.GetAttributes<IApiActionAttribute>(false);
89-
var declaringInterfaceAttributes = interfaceType == method.DeclaringType
90-
? Enumerable.Empty<IApiActionAttribute>()
91-
: method.DeclaringType.GetAttributes<IApiActionAttribute>(false);
9286

9387
// 接口特性优先于方法所在类型的特性
94-
var actionAttributes = methodAttributes
95-
.Concat(interfaceAttributes)
96-
.Concat(declaringInterfaceAttributes)
88+
var actionAttributes = method
89+
.GetAttributes<IApiActionAttribute>()
90+
.Concat(interfaceType.GetAttributes<IApiActionAttribute>())
9791
.Distinct(MultiplableComparer<IApiActionAttribute>.Default)
9892
.OrderBy(item => item.OrderIndex)
9993
.ToReadOnlyList();
10094

10195
var filterAttributes = method
102-
.GetAttributes<IApiFilterAttribute>(true)
96+
.GetAttributes<IApiFilterAttribute>()
97+
.Concat(interfaceType.GetAttributes<IApiFilterAttribute>())
10398
.Distinct(MultiplableComparer<IApiFilterAttribute>.Default)
10499
.OrderBy(item => item.OrderIndex)
105100
.Where(item => item.Enable)
@@ -114,7 +109,7 @@ public ApiActionDescriptor(MethodInfo method, Type? interfaceType = default)
114109
this.CacheAttribute = method.GetAttribute<IApiCacheAttribute>();
115110
this.FilterAttributes = filterAttributes;
116111

117-
this.Return = new ApiReturnDescriptor(method);
112+
this.Return = new ApiReturnDescriptor(method, interfaceType);
118113
this.Parameters = method.GetParameters().Select(p => new ApiParameterDescriptor(p)).ToReadOnlyList();
119114
this.Properties = new ConcurrentDictionary<object, object>();
120115
}

WebApiClientCore/ApiReturnDescriptor.cs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,20 @@ public class ApiReturnDescriptor
3232
/// <summary>
3333
/// 请求Api的返回描述
3434
/// </summary>
35-
/// <param name="method">方法信息</param>
35+
/// <param name="method">方法信息</param>
3636
/// <exception cref="ArgumentNullException"></exception>
3737
public ApiReturnDescriptor(MethodInfo method)
38+
: this(method, method.DeclaringType)
39+
{
40+
}
41+
42+
/// <summary>
43+
/// 请求Api的返回描述
44+
/// </summary>
45+
/// <param name="method">方法信息</param>
46+
/// <param name="interfaceType">接口类型</param>
47+
/// <exception cref="ArgumentNullException"></exception>
48+
public ApiReturnDescriptor(MethodInfo method, Type interfaceType)
3849
{
3950
if (method == null)
4051
{
@@ -50,7 +61,8 @@ public ApiReturnDescriptor(MethodInfo method)
5061
this.ReturnType = method.ReturnType;
5162
this.DataType = dataType;
5263
this.Attributes = method
53-
.GetAttributes<IApiReturnAttribute>(true)
64+
.GetAttributes<IApiReturnAttribute>()
65+
.Concat(interfaceType.GetAttributes<IApiReturnAttribute>())
5466
.Concat(GetDefaultAttributes(dataType))
5567
.Distinct(MultiplableComparer<IApiReturnAttribute>.Default)
5668
.OrderBy(item => item.OrderIndex)
Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System.Collections.Generic;
1+
using System;
2+
using System.Collections.Generic;
23
using System.Linq;
34
using System.Reflection;
45

@@ -10,37 +11,29 @@ namespace WebApiClientCore
1011
static class AttributeExtensions
1112
{
1213
/// <summary>
13-
/// 获取成员的特性
14+
/// 获取方法的特性
1415
/// </summary>
1516
/// <typeparam name="TAttribute"></typeparam>
16-
/// <param name="member">成员</param>
17+
/// <param name="method">方法</param>
1718
/// <returns></returns>
18-
public static TAttribute? GetAttribute<TAttribute>(this MemberInfo member) where TAttribute : class
19+
public static TAttribute? GetAttribute<TAttribute>(this MethodInfo method) where TAttribute : class
1920
{
20-
return member.GetCustomAttributes().OfType<TAttribute>().FirstOrDefault();
21+
return method.GetAttributes<TAttribute>().FirstOrDefault();
2122
}
2223

2324
/// <summary>
24-
/// 获取成员的特性
25+
/// 获取方法的特性
2526
/// </summary>
2627
/// <typeparam name="TAttribute"></typeparam>
27-
/// <param name="member">成员</param>
28-
/// <param name="includeDeclaringType">是否也包括声明类型</param>
28+
/// <param name="method">方法</param>
2929
/// <returns></returns>
30-
public static IEnumerable<TAttribute> GetAttributes<TAttribute>(this MemberInfo member, bool includeDeclaringType) where TAttribute : class
30+
public static IEnumerable<TAttribute> GetAttributes<TAttribute>(this MethodInfo method) where TAttribute : class
3131
{
32-
var self = member.GetCustomAttributes().OfType<TAttribute>();
33-
if (includeDeclaringType == false || member.DeclaringType == null)
34-
{
35-
return self;
36-
}
37-
38-
var decalring = member.DeclaringType.GetCustomAttributes().OfType<TAttribute>();
39-
return self.Concat(decalring);
32+
return method.GetCustomAttributes().OfType<TAttribute>();
4033
}
4134

4235
/// <summary>
43-
/// 获取成员的特性
36+
/// 获取参数的特性
4437
/// </summary>
4538
/// <typeparam name="TAttribute"></typeparam>
4639
/// <param name="parameter">参数</param>
@@ -49,5 +42,19 @@ public static IEnumerable<TAttribute> GetAttributes<TAttribute>(this ParameterIn
4942
{
5043
return parameter.GetCustomAttributes().OfType<TAttribute>();
5144
}
45+
46+
/// <summary>
47+
/// 获取接口以及其基础接口定义的特性
48+
/// </summary>
49+
/// <typeparam name="TAttribute"></typeparam>
50+
/// <param name="interfaceType">接口类型</param>
51+
/// <returns></returns>
52+
public static IEnumerable<TAttribute> GetAttributes<TAttribute>(this Type interfaceType) where TAttribute : class
53+
{
54+
return new[] { interfaceType }
55+
.Concat(interfaceType.GetInterfaces())
56+
.SelectMany(item => item.GetCustomAttributes()
57+
.OfType<TAttribute>());
58+
}
5259
}
5360
}

0 commit comments

Comments
 (0)