Browse Source

Enhancement ApiTypeNameHelper

pull/6065/head
maliming 6 years ago
parent
commit
c0edc126cb
  1. 30
      framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/ApiTypeNameHelper.cs
  2. 29
      framework/test/Volo.Abp.Http.Tests/Volo/Abp/Http/ApiTypeNameHelper_Tests.cs

30
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) 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 (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)) 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) 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 (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)) else if (TypeHelper.IsEnumerable(type, out var itemType, includePrimitives: false))
{ {
if (itemType != type) if (!duplicateTypes.Contains(itemType))
{ {
return $"[{GetSimpleTypeName(itemType)}]"; return $"[{GetSimpleTypeName(itemType, duplicateTypes)}]";
} }
} }

29
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(CycleClass)).ShouldBe(TypeHelper.GetFullNameHandlingNullableAndGenerics(typeof(CycleClass)));
ApiTypeNameHelper.GetTypeName(typeof(CycleClass2)).ShouldBe(TypeHelper.GetFullNameHandlingNullableAndGenerics(typeof(CycleClass2))); ApiTypeNameHelper.GetTypeName(typeof(CycleClass2)).ShouldBe(TypeHelper.GetFullNameHandlingNullableAndGenerics(typeof(CycleClass2)));
ApiTypeNameHelper.GetTypeName(typeof(CycleClass3)).ShouldBe($"[{TypeHelper.GetFullNameHandlingNullableAndGenerics(typeof(CycleClass4))}]");
} }
[Fact] [Fact]
@ -21,6 +22,7 @@ namespace Volo.Abp.Http
{ {
ApiTypeNameHelper.GetSimpleTypeName(typeof(CycleClass)).ShouldBe(TypeHelper.GetSimplifiedName(typeof(CycleClass))); ApiTypeNameHelper.GetSimpleTypeName(typeof(CycleClass)).ShouldBe(TypeHelper.GetSimplifiedName(typeof(CycleClass)));
ApiTypeNameHelper.GetSimpleTypeName(typeof(CycleClass2)).ShouldBe(TypeHelper.GetSimplifiedName(typeof(CycleClass2))); ApiTypeNameHelper.GetSimpleTypeName(typeof(CycleClass2)).ShouldBe(TypeHelper.GetSimplifiedName(typeof(CycleClass2)));
ApiTypeNameHelper.GetTypeName(typeof(CycleClass3)).ShouldBe($"[{TypeHelper.GetSimplifiedName(typeof(CycleClass4))}]");
} }
class CycleClass : IEnumerable<CycleClass> class CycleClass : IEnumerable<CycleClass>
@ -40,5 +42,32 @@ namespace Volo.Abp.Http
{ {
} }
class CycleClass3 : IEnumerable<CycleClass4>
{
public IEnumerator<CycleClass4> GetEnumerator()
{
yield return new CycleClass4();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
class CycleClass4 : IEnumerable<CycleClass3>
{
public IEnumerator<CycleClass3> GetEnumerator()
{
yield return new CycleClass3();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
} }
} }

Loading…
Cancel
Save