From c0edc126cbfb5efa97585fd06d11579abb838720 Mon Sep 17 00:00:00 2001 From: maliming Date: Thu, 5 Nov 2020 13:27:20 +0800 Subject: [PATCH] Enhancement ApiTypeNameHelper --- .../Abp/Http/Modeling/ApiTypeNameHelper.cs | 30 ++++++++++++++----- .../Volo/Abp/Http/ApiTypeNameHelper_Tests.cs | 29 ++++++++++++++++++ 2 files changed, 51 insertions(+), 8 deletions(-) diff --git a/framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/ApiTypeNameHelper.cs b/framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/ApiTypeNameHelper.cs index 1bdb2ba9ab..b25c185642 100644 --- a/framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/ApiTypeNameHelper.cs +++ b/framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/ApiTypeNameHelper.cs @@ -8,18 +8,25 @@ namespace Volo.Abp.Http.Modeling { public static string GetTypeName(Type type) { + return GetTypeName(type, new TypeList()); + } + + private static string GetTypeName(Type type, ITypeList duplicateTypes) + { + duplicateTypes.Add(type); + if (TypeHelper.IsDictionary(type, out var keyType, out var valueType)) { - if (keyType != type && valueType != type) + if (!duplicateTypes.Contains(keyType) && !duplicateTypes.Contains(valueType)) { - return $"{{{GetTypeName(keyType)}:{GetTypeName(valueType)}}}"; + return $"{{{GetTypeName(keyType, duplicateTypes)}:{GetTypeName(valueType, duplicateTypes)}}}"; } } else if (TypeHelper.IsEnumerable(type, out var itemType, includePrimitives: false)) { - if (itemType != type) + if (!duplicateTypes.Contains(itemType)) { - return $"[{GetTypeName(itemType)}]"; + return $"[{GetTypeName(itemType, duplicateTypes)}]"; } } @@ -28,18 +35,25 @@ namespace Volo.Abp.Http.Modeling public static string GetSimpleTypeName(Type type) { + return GetSimpleTypeName(type, new TypeList()); + } + + private static string GetSimpleTypeName(Type type, ITypeList duplicateTypes) + { + duplicateTypes.Add(type); + if (TypeHelper.IsDictionary(type, out var keyType, out var valueType)) { - if (keyType != type && valueType != type) + if (!duplicateTypes.Contains(keyType) && !duplicateTypes.Contains(valueType)) { - return $"{{{GetSimpleTypeName(keyType)}:{GetSimpleTypeName(valueType)}}}"; + return $"{{{GetSimpleTypeName(keyType, duplicateTypes)}:{GetSimpleTypeName(valueType, duplicateTypes)}}}"; } } else if (TypeHelper.IsEnumerable(type, out var itemType, includePrimitives: false)) { - if (itemType != type) + if (!duplicateTypes.Contains(itemType)) { - return $"[{GetSimpleTypeName(itemType)}]"; + return $"[{GetSimpleTypeName(itemType, duplicateTypes)}]"; } } diff --git a/framework/test/Volo.Abp.Http.Tests/Volo/Abp/Http/ApiTypeNameHelper_Tests.cs b/framework/test/Volo.Abp.Http.Tests/Volo/Abp/Http/ApiTypeNameHelper_Tests.cs index 45efde8b08..3a9c9d1562 100644 --- a/framework/test/Volo.Abp.Http.Tests/Volo/Abp/Http/ApiTypeNameHelper_Tests.cs +++ b/framework/test/Volo.Abp.Http.Tests/Volo/Abp/Http/ApiTypeNameHelper_Tests.cs @@ -14,6 +14,7 @@ namespace Volo.Abp.Http { ApiTypeNameHelper.GetTypeName(typeof(CycleClass)).ShouldBe(TypeHelper.GetFullNameHandlingNullableAndGenerics(typeof(CycleClass))); ApiTypeNameHelper.GetTypeName(typeof(CycleClass2)).ShouldBe(TypeHelper.GetFullNameHandlingNullableAndGenerics(typeof(CycleClass2))); + ApiTypeNameHelper.GetTypeName(typeof(CycleClass3)).ShouldBe($"[{TypeHelper.GetFullNameHandlingNullableAndGenerics(typeof(CycleClass4))}]"); } [Fact] @@ -21,6 +22,7 @@ namespace Volo.Abp.Http { ApiTypeNameHelper.GetSimpleTypeName(typeof(CycleClass)).ShouldBe(TypeHelper.GetSimplifiedName(typeof(CycleClass))); ApiTypeNameHelper.GetSimpleTypeName(typeof(CycleClass2)).ShouldBe(TypeHelper.GetSimplifiedName(typeof(CycleClass2))); + ApiTypeNameHelper.GetTypeName(typeof(CycleClass3)).ShouldBe($"[{TypeHelper.GetSimplifiedName(typeof(CycleClass4))}]"); } class CycleClass : IEnumerable @@ -40,5 +42,32 @@ namespace Volo.Abp.Http { } + + class CycleClass3 : IEnumerable + { + + public IEnumerator GetEnumerator() + { + yield return new CycleClass4(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + } + + class CycleClass4 : IEnumerable + { + public IEnumerator GetEnumerator() + { + yield return new CycleClass3(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + } } }