Skip to content

Commit d206210

Browse files
committed
Cleanups and fixes
1 parent eb3ab64 commit d206210

File tree

5 files changed

+57
-20
lines changed

5 files changed

+57
-20
lines changed

src/Components/Endpoints/src/Binding/Converters/CompiledComplexTypeConverter.cs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,8 @@ namespace Microsoft.AspNetCore.Components.Endpoints.Binding;
55

66
internal class CompiledComplexTypeConverter<T>(CompiledComplexTypeConverter<T>.ConverterDelegate body) : FormDataConverter<T>
77
{
8-
public delegate bool ConverterDelegate(ref FormDataReader reader, Type type, FormDataSerializerOptions options, out T? result, out bool found);
8+
public delegate bool ConverterDelegate(ref FormDataReader reader, Type type, FormDataMapperOptions options, out T? result, out bool found);
99

10-
internal override bool TryRead(ref FormDataReader context, Type type, FormDataSerializerOptions options, out T? result, out bool found)
11-
{
12-
return body(ref context, type, options, out result, out found);
13-
}
10+
internal override bool TryRead(ref FormDataReader context, Type type, FormDataMapperOptions options, out T? result, out bool found) =>
11+
body(ref context, type, options, out result, out found);
1412
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
// Licensed to the .NET Foundation under one or more agreements.
1+
// Licensed to the .NET Foundation under one or more agreements.
22
// The .NET Foundation licenses this file to you under the MIT license.
33

44
namespace Microsoft.AspNetCore.Components.Endpoints.Binding;
55

66
internal abstract class ComplexTypeExpressionConverterFactory
77
{
8-
internal abstract FormDataConverter CreateConverter(Type type, FormDataSerializerOptions options);
8+
internal abstract FormDataConverter CreateConverter(Type type, FormDataMapperOptions options);
99
}

src/Components/Endpoints/src/Binding/Factories/ComplexType/ComplexTypeExpressionConverterFactoryOfT.cs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,15 @@
66

77
namespace Microsoft.AspNetCore.Components.Endpoints.Binding;
88

9-
internal class ComplexTypeExpressionConverterFactory<T> : ComplexTypeExpressionConverterFactory
9+
internal sealed class ComplexTypeExpressionConverterFactory<T> : ComplexTypeExpressionConverterFactory
1010
{
11-
internal override CompiledComplexTypeConverter<T> CreateConverter(Type type, FormDataSerializerOptions options)
11+
internal override CompiledComplexTypeConverter<T> CreateConverter(Type type, FormDataMapperOptions options)
1212
{
1313
var body = CreateConverterBody(type, options);
1414
return new CompiledComplexTypeConverter<T>(body);
1515
}
1616

17-
private CompiledComplexTypeConverter<T>.ConverterDelegate CreateConverterBody(Type type, FormDataSerializerOptions options)
17+
private CompiledComplexTypeConverter<T>.ConverterDelegate CreateConverterBody(Type type, FormDataMapperOptions options)
1818
{
1919
var properties = PropertyHelper.GetVisibleProperties(type);
2020

@@ -62,7 +62,7 @@ private CompiledComplexTypeConverter<T>.ConverterDelegate CreateConverterBody(Ty
6262
propertyConverterVar,
6363
Expression.Call(
6464
optionsParam,
65-
nameof(FormDataSerializerOptions.ResolveConverter),
65+
nameof(FormDataMapperOptions.ResolveConverter),
6666
new[] { property.PropertyType },
6767
Array.Empty<Expression>()));
6868
body.Add(propertyConverter);
@@ -122,7 +122,7 @@ static IEnumerable<Expression> CreateInstanceAndAssignProperties(
122122
}
123123
}
124124

125-
private CompiledComplexTypeConverter<T>.ConverterDelegate CreateConverterFunction(
125+
private static CompiledComplexTypeConverter<T>.ConverterDelegate CreateConverterFunction(
126126
List<ParameterExpression> parameters,
127127
List<ParameterExpression> variables,
128128
List<Expression> body)
@@ -139,7 +139,7 @@ private static FormDataConverterReadParameters CreateFormDataConverterParameters
139139
return new(
140140
Expression.Parameter(typeof(FormDataReader).MakeByRefType(), "reader"),
141141
Expression.Parameter(typeof(Type), "type"),
142-
Expression.Parameter(typeof(FormDataSerializerOptions), "options"),
142+
Expression.Parameter(typeof(FormDataMapperOptions), "options"),
143143
Expression.Parameter(typeof(T).MakeByRefType(), "result"),
144144
Expression.Parameter(typeof(bool).MakeByRefType(), "foundValue"));
145145
}
@@ -150,5 +150,4 @@ private record struct FormDataConverterReadParameters(
150150
ParameterExpression OptionsParam,
151151
ParameterExpression ResultParam,
152152
ParameterExpression FoundValueParam);
153-
154153
}

src/Components/Endpoints/src/Binding/Factories/ComplexTypeConverterFactory.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ internal class ComplexTypeConverterFactory : IFormDataConverterFactory
1111
{
1212
internal static readonly ComplexTypeConverterFactory Instance = new();
1313

14-
public bool CanConvert(Type type, FormDataSerializerOptions options)
14+
public bool CanConvert(Type type, FormDataMapperOptions options)
1515
{
1616
if (type.GetConstructor(Type.EmptyTypes) == null && !type.IsValueType)
1717
{
@@ -106,7 +106,7 @@ public bool CanConvert(Type type, FormDataSerializerOptions options)
106106
// }
107107
// }
108108

109-
public FormDataConverter CreateConverter(Type type, FormDataSerializerOptions options)
109+
public FormDataConverter CreateConverter(Type type, FormDataMapperOptions options)
110110
{
111111
if (Activator.CreateInstance(typeof(ComplexTypeExpressionConverterFactory<>).MakeGenericType(type))
112112
is not ComplexTypeExpressionConverterFactory factory)

src/Components/Endpoints/test/Binding/FormDataMapperTests.cs

Lines changed: 44 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -742,10 +742,10 @@ public void CanDeserialize_ComplexValueType_Address()
742742
["ZipCode"] = "98052",
743743
};
744744
var reader = new FormDataReader(data, CultureInfo.InvariantCulture);
745-
var options = new FormDataSerializerOptions();
745+
var options = new FormDataMapperOptions();
746746

747747
// Act
748-
var result = FormDataDeserializer.Deserialize<Address>(reader, options);
748+
var result = FormDataMapper.Map<Address>(reader, options);
749749

750750
// Assert
751751
Assert.Equal(expected.City, result.City);
@@ -768,10 +768,10 @@ public void CanDeserialize_ComplexReferenceType_Customer()
768768
};
769769

770770
var reader = new FormDataReader(data, CultureInfo.InvariantCulture);
771-
var options = new FormDataSerializerOptions();
771+
var options = new FormDataMapperOptions();
772772

773773
// Act
774-
var result = FormDataDeserializer.Deserialize<Customer>(reader, options);
774+
var result = FormDataMapper.Map<Customer>(reader, options);
775775

776776
// Assert
777777
Assert.NotNull(result);
@@ -781,6 +781,37 @@ public void CanDeserialize_ComplexReferenceType_Customer()
781781
Assert.Equal(expected.IsPreferred, result.IsPreferred);
782782
}
783783

784+
[Fact]
785+
public void CanDeserialize_ComplexReferenceType_Inheritance()
786+
{
787+
// Arrange
788+
var expected = new FrequentCustomer() { Age = 20, Name = "John Doe", Email = "[email protected]" , IsPreferred = true, TotalVisits = 10, PreferredStore = "Redmond", MonthlyFrequency = 0.8 };
789+
var data = new Dictionary<string, StringValues>()
790+
{
791+
["Age"] = "20",
792+
["Name"] = "John Doe",
793+
["Email"] = "[email protected]",
794+
["IsPreferred"] = "true",
795+
["TotalVisits"] = "10",
796+
["PreferredStore"] = "Redmond",
797+
["MonthlyFrequency"] = "0.8",
798+
};
799+
800+
var reader = new FormDataReader(data, CultureInfo.InvariantCulture);
801+
var options = new FormDataMapperOptions();
802+
803+
// Act
804+
var result = FormDataMapper.Map<FrequentCustomer>(reader, options);
805+
Assert.NotNull(result);
806+
Assert.Equal(expected.Age, result.Age);
807+
Assert.Equal(expected.Name, result.Name);
808+
Assert.Equal(expected.Email, result.Email);
809+
Assert.Equal(expected.IsPreferred, result.IsPreferred);
810+
Assert.Equal(expected.TotalVisits, result.TotalVisits);
811+
Assert.Equal(expected.PreferredStore, result.PreferredStore);
812+
Assert.Equal(expected.MonthlyFrequency, result.MonthlyFrequency);
813+
}
814+
784815
public static TheoryData<string, Type, object> NullableBasicTypes
785816
{
786817
get
@@ -1079,6 +1110,15 @@ internal class Customer
10791110
public bool IsPreferred { get; set; }
10801111
}
10811112

1113+
internal class FrequentCustomer : Customer
1114+
{
1115+
public int TotalVisits { get; set; }
1116+
1117+
public string PreferredStore { get; set; }
1118+
1119+
public double MonthlyFrequency { get; set; }
1120+
}
1121+
10821122
// Implements ICollection<T> delegating to List<T> _inner;
10831123
internal class CustomCollection<T> : ICollection<T>
10841124
{

0 commit comments

Comments
 (0)