Browse Source

Merge pull request #24917 from abpframework/ObjectMappingHelper-patch

Reject non-generic collections and add tests
pull/24919/head
Engincan VESKE 1 month ago
committed by GitHub
parent
commit
aada21c96d
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 11
      framework/src/Volo.Abp.ObjectMapping/Volo/Abp/ObjectMapping/ObjectMappingHelper.cs
  2. 84
      framework/test/Volo.Abp.ObjectMapping.Tests/Volo/Abp/ObjectMapping/ObjectMappingHelper_Tests.cs

11
framework/src/Volo.Abp.ObjectMapping/Volo/Abp/ObjectMapping/ObjectMappingHelper.cs

@ -55,10 +55,17 @@ public static class ObjectMappingHelper
return true;
}
if (type.IsGenericType &&
supportedCollectionTypes.Contains(type.GetGenericTypeDefinition()) ||
if ((type.IsGenericType &&
supportedCollectionTypes.Contains(type.GetGenericTypeDefinition())) ||
type.GetInterfaces().Any(i => i.IsGenericType && supportedCollectionTypes.Contains(i.GetGenericTypeDefinition())))
{
if (!type.IsGenericType)
{
elementType = null!;
definitionGenericType = null!;
return false;
}
elementType = type.GetGenericArguments()[0];
definitionGenericType = type.GetGenericTypeDefinition();
if (definitionGenericType == typeof(IEnumerable<>) ||

84
framework/test/Volo.Abp.ObjectMapping.Tests/Volo/Abp/ObjectMapping/ObjectMappingHelper_Tests.cs

@ -0,0 +1,84 @@
using System.Collections.Generic;
using System.Collections.ObjectModel;
using Shouldly;
using Xunit;
namespace Volo.Abp.ObjectMapping;
public class ObjectMappingHelper_Tests
{
[Fact]
public void IsCollectionGenericType_Should_Return_True_For_Standard_GenericCollection()
{
var result = ObjectMappingHelper.IsCollectionGenericType<List<MappingTestSource>, List<MappingTestDestination>>(
out var sourceArg, out var destArg, out var defGenericType);
result.ShouldBeTrue();
sourceArg.ShouldBe(typeof(MappingTestSource));
destArg.ShouldBe(typeof(MappingTestDestination));
defGenericType.ShouldBe(typeof(List<>));
}
[Fact]
public void IsCollectionGenericType_Should_Return_True_For_Array()
{
var result = ObjectMappingHelper.IsCollectionGenericType<MappingTestSource[], MappingTestDestination[]>(
out var sourceArg, out var destArg, out _);
result.ShouldBeTrue();
sourceArg.ShouldBe(typeof(MappingTestSource));
destArg.ShouldBe(typeof(MappingTestDestination));
}
[Fact]
public void IsCollectionGenericType_Should_Normalize_IEnumerable_To_List()
{
var result = ObjectMappingHelper.IsCollectionGenericType<IEnumerable<MappingTestSource>, IEnumerable<MappingTestDestination>>(
out _, out _, out var defGenericType);
result.ShouldBeTrue();
defGenericType.ShouldBe(typeof(List<>));
}
[Fact]
public void IsCollectionGenericType_Should_Normalize_ICollection_To_Collection()
{
var result = ObjectMappingHelper.IsCollectionGenericType<ICollection<MappingTestSource>, ICollection<MappingTestDestination>>(
out _, out _, out var defGenericType);
result.ShouldBeTrue();
defGenericType.ShouldBe(typeof(Collection<>));
}
[Fact]
public void IsCollectionGenericType_Should_Return_False_For_NonCollection()
{
var result = ObjectMappingHelper.IsCollectionGenericType<MappingTestSource, MappingTestDestination>(
out _, out _, out _);
result.ShouldBeFalse();
}
[Fact]
public void IsCollectionGenericType_Should_Return_False_For_NonGeneric_DerivedCollection()
{
var result = ObjectMappingHelper.IsCollectionGenericType<List<MappingTestSource>, MappingTestDestinationList>(
out _, out _, out _);
result.ShouldBeFalse();
}
}
public class MappingTestSource
{
public string Value { get; set; } = "";
}
public class MappingTestDestination
{
public string Value { get; set; } = "";
}
public class MappingTestDestinationList : List<MappingTestDestination>
{
}
Loading…
Cancel
Save