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)
{
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)}]";
}
}

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(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<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