Skip to content

Commit f59abe5

Browse files
committed
Use non-static to store excluded types.
1 parent a99c2aa commit f59abe5

File tree

3 files changed

+43
-8
lines changed

3 files changed

+43
-8
lines changed

framework/src/Volo.Abp.Json/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpHasExtraPropertiesJsonConverter.cs

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,23 @@ public class AbpHasExtraPropertiesJsonConverter<T> : JsonConverter<T>
1111
{
1212
public override T Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
1313
{
14-
var newOptions = JsonSerializerOptionsHelper.Create(options, x =>
15-
x == this ||
16-
x.GetType() == typeof(AbpHasExtraPropertiesJsonConverterFactory));
14+
var newOptions = JsonSerializerOptionsHelper.Create(options, x => x == this);
15+
16+
var converterFactory = newOptions.Converters.FirstOrDefault(x => x is AbpHasExtraPropertiesJsonConverterFactory).As<AbpHasExtraPropertiesJsonConverterFactory>();
17+
var newConverterFactory = new AbpHasExtraPropertiesJsonConverterFactory();
18+
if (converterFactory != null)
19+
{
20+
newOptions.Converters.Remove(converterFactory);
21+
newConverterFactory.AddExcludeTypes(converterFactory.GetExcludeTypes().ToArray());
22+
}
23+
else
24+
{
25+
newConverterFactory.AddExcludeTypes(typeToConvert);
26+
}
27+
28+
newConverterFactory.AddExcludeTypes(typeToConvert);
29+
newOptions.Converters.Add(newConverterFactory);
1730

18-
newOptions.Converters.Add(new AbpHasExtraPropertiesJsonConverterFactory(typeToConvert));
1931
var rootElement = JsonDocument.ParseValue(ref reader).RootElement;
2032
if (rootElement.ValueKind == JsonValueKind.Object)
2133
{

framework/src/Volo.Abp.Json/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpHasExtraPropertiesJsonConverterFactory.cs

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using System.Collections.Concurrent;
33
using System.Collections.Generic;
4+
using System.Collections.Immutable;
45
using System.Reflection;
56
using System.Text.Json;
67
using System.Text.Json.Serialization;
@@ -12,16 +13,22 @@ public class AbpHasExtraPropertiesJsonConverterFactory : JsonConverterFactory
1213
{
1314
private static readonly ConcurrentDictionary<Type, bool> CachedTypes = new ConcurrentDictionary<Type, bool>();
1415

15-
private static readonly List<Type> ExcludeTypes = new List<Type>();
16+
private readonly List<Type> _excludeTypes = new List<Type>();
1617

17-
public AbpHasExtraPropertiesJsonConverterFactory(params Type[] excludeTypes)
18+
public virtual AbpHasExtraPropertiesJsonConverterFactory AddExcludeTypes(params Type[] excludeTypes)
1819
{
19-
ExcludeTypes.AddIfNotContains(excludeTypes);
20+
_excludeTypes.AddIfNotContains(excludeTypes);
21+
return this;
22+
}
23+
24+
public virtual IReadOnlyList<Type> GetExcludeTypes()
25+
{
26+
return _excludeTypes.ToImmutableList();
2027
}
2128

2229
public override bool CanConvert(Type typeToConvert)
2330
{
24-
if (ExcludeTypes.Contains(typeToConvert))
31+
if (_excludeTypes.Contains(typeToConvert))
2532
{
2633
return false;
2734
}

framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/AbpHasExtraPropertiesJsonConverter_Tests.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,22 @@ public void JsonConverter_Test()
4343
fooDto.BarDtos.Count.ShouldBe(1);
4444
fooDto.BarDtos.First().Name.ShouldBe("bar-dto");
4545
fooDto.BarDtos.First().GetProperty("bar").ShouldBe("bar-value");
46+
47+
fooDto.Name = "new-foo-dto";
48+
fooDto.SetProperty("foo", "new-foo-value");
49+
fooDto.BarDtos.First().Name = "new-bar-dto";
50+
fooDto.BarDtos.First().SetProperty("bar", "new-bar-value");
51+
52+
json = _jsonSerializer.Serialize(fooDto);
53+
54+
fooDto = _jsonSerializer.Deserialize<FooDto>(json);
55+
fooDto.ShouldNotBeNull();
56+
fooDto.Name.ShouldBe("new-foo-dto");
57+
fooDto.GetProperty("foo").ShouldBe("new-foo-value");
58+
59+
fooDto.BarDtos.Count.ShouldBe(1);
60+
fooDto.BarDtos.First().Name.ShouldBe("new-bar-dto");
61+
fooDto.BarDtos.First().GetProperty("bar").ShouldBe("new-bar-value");
4662
}
4763
}
4864

0 commit comments

Comments
 (0)