Skip to content

Commit 4c0bf38

Browse files
committed
PropertyDescriptor不使用缓存
1 parent 2b0a8b6 commit 4c0bf38

File tree

1 file changed

+18
-100
lines changed

1 file changed

+18
-100
lines changed

WebApiClient/Defaults/Internal/PropertyContractResolver.cs

Lines changed: 18 additions & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -44,19 +44,19 @@ public PropertyContractResolver(bool camelCase, FormatScope scope)
4444
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
4545
{
4646
var property = base.CreateProperty(member, memberSerialization);
47-
var descriptor = PropertyDescriptor.GetDescriptor(this.formatScope, member);
48-
49-
property.PropertyName = descriptor.Name;
47+
var descriptor = new PropertyDescriptor(this.formatScope, member);
48+
49+
property.PropertyName = descriptor.AliasName;
5050
property.Ignored = descriptor.IgnoreSerialized;
5151

5252
if (this.useCamelCase == true)
5353
{
5454
property.PropertyName = FormatOptions.CamelCase(property.PropertyName);
5555
}
5656

57-
if (property.Converter == null)
57+
if (property.Converter == null && descriptor.DateTimeFormat != null)
5858
{
59-
property.Converter = descriptor.DateTimeConverter;
59+
property.Converter = new IsoDateTimeConverter { DateTimeFormat = descriptor.DateTimeFormat };
6060
}
6161

6262
if (descriptor.IgnoreWhenNull == true)
@@ -75,12 +75,12 @@ private class PropertyDescriptor
7575
/// <summary>
7676
/// 获取属性别名或名称
7777
/// </summary>
78-
public string Name { get; private set; }
78+
public string AliasName { get; private set; }
7979

8080
/// <summary>
81-
/// 获取时间转换器
81+
/// 获取日期时间格式
8282
/// </summary>
83-
public JsonConverter DateTimeConverter { get; private set; }
83+
public string DateTimeFormat { get; private set; }
8484

8585
/// <summary>
8686
/// 获取是否忽略序列化
@@ -95,110 +95,28 @@ private class PropertyDescriptor
9595
/// <summary>
9696
/// 属性的描述
9797
/// </summary>
98-
/// <param name="scopeMember"></param>
99-
private PropertyDescriptor(ScopeMember scopeMember)
98+
/// <param name="scope"></param>
99+
/// <param name="member"></param>
100+
public PropertyDescriptor(FormatScope scope, MemberInfo member)
100101
{
101-
var member = scopeMember.MemberInfo;
102-
var formatScope = scopeMember.FormatScope;
103-
104102
var aliasAsAttribute = member.GetAttribute<AliasAsAttribute>(true);
105-
if (aliasAsAttribute != null && aliasAsAttribute.IsDefinedScope(formatScope))
103+
if (aliasAsAttribute != null && aliasAsAttribute.IsDefinedScope(scope))
106104
{
107-
this.Name = aliasAsAttribute.Name;
105+
this.AliasName = aliasAsAttribute.Name;
108106
}
109107
else
110108
{
111-
this.Name = member.Name;
109+
this.AliasName = member.Name;
112110
}
113111

114112
var datetimeFormatAttribute = member.GetAttribute<DateTimeFormatAttribute>(true);
115-
if (datetimeFormatAttribute != null && datetimeFormatAttribute.IsDefinedScope(formatScope))
113+
if (datetimeFormatAttribute != null && datetimeFormatAttribute.IsDefinedScope(scope))
116114
{
117-
this.DateTimeConverter = new IsoDateTimeConverter { DateTimeFormat = datetimeFormatAttribute.Format };
115+
this.DateTimeFormat = datetimeFormatAttribute.Format;
118116
}
119117

120-
this.IgnoreSerialized = member.IsDefinedFormatScope<IgnoreSerializedAttribute>(formatScope);
121-
this.IgnoreWhenNull = member.IsDefinedFormatScope<IgnoreWhenNullAttribute>(formatScope);
122-
}
123-
124-
125-
/// <summary>
126-
/// 属性的描述缓存
127-
/// </summary>
128-
private static readonly ConcurrentDictionary<ScopeMember, PropertyDescriptor> descriptorCache;
129-
130-
/// <summary>
131-
/// 静态构造器
132-
/// </summary>
133-
static PropertyDescriptor()
134-
{
135-
descriptorCache = new ConcurrentDictionary<ScopeMember, PropertyDescriptor>(new ScopeMemberComparer());
136-
}
137-
138-
/// <summary>
139-
/// 获取成员的描述
140-
/// </summary>
141-
/// <param name="scope">范围</param>
142-
/// <param name="member">成员</param>
143-
/// <returns></returns>
144-
public static PropertyDescriptor GetDescriptor(FormatScope scope, MemberInfo member)
145-
{
146-
var scopeProperty = new ScopeMember(scope, member);
147-
return descriptorCache.GetOrAdd(scopeProperty, (s) => new PropertyDescriptor(s));
148-
}
149-
150-
/// <summary>
151-
/// 表示序列化范围属性
152-
/// </summary>
153-
private class ScopeMember
154-
{
155-
/// <summary>
156-
/// 序列化范围
157-
/// </summary>
158-
public FormatScope FormatScope { get; private set; }
159-
160-
/// <summary>
161-
/// 属性
162-
/// </summary>
163-
public MemberInfo MemberInfo { get; private set; }
164-
165-
/// <summary>
166-
/// 序列化范围属性
167-
/// </summary>
168-
/// <param name="scope"></param>
169-
/// <param name="member"></param>
170-
public ScopeMember(FormatScope scope, MemberInfo member)
171-
{
172-
this.FormatScope = scope;
173-
this.MemberInfo = member;
174-
}
175-
}
176-
177-
/// <summary>
178-
/// 表示序列化范围属性比较器
179-
/// </summary>
180-
private class ScopeMemberComparer : IEqualityComparer<ScopeMember>
181-
{
182-
/// <summary>
183-
/// 是否相等
184-
/// </summary>
185-
/// <param name="x"></param>
186-
/// <param name="y"></param>
187-
/// <returns></returns>
188-
public bool Equals(ScopeMember x, ScopeMember y)
189-
{
190-
return true;
191-
}
192-
193-
/// <summary>
194-
/// 获取哈希值
195-
/// </summary>
196-
/// <param name="obj"></param>
197-
/// <returns></returns>
198-
public int GetHashCode(ScopeMember obj)
199-
{
200-
return obj.FormatScope.GetHashCode() ^ obj.MemberInfo.GetHashCode();
201-
}
118+
this.IgnoreSerialized = member.IsDefinedFormatScope<IgnoreSerializedAttribute>(scope);
119+
this.IgnoreWhenNull = member.IsDefinedFormatScope<IgnoreWhenNullAttribute>(scope);
202120
}
203121
}
204122
}

0 commit comments

Comments
 (0)