Skip to content

Commit eab1f55

Browse files
committed
Simplify clone methods by using generic type parameter
1 parent 8e1d16d commit eab1f55

File tree

2 files changed

+12
-23
lines changed

2 files changed

+12
-23
lines changed

src/JsonApiDotNetCore.OpenApi/JsonApiActionDescriptorCollectionProvider.cs

Lines changed: 9 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,10 @@ namespace JsonApiDotNetCore.OpenApi;
1313

1414
/// <summary>
1515
/// Adds JsonApiDotNetCore metadata to <see cref="ControllerActionDescriptor" />s if available. This translates to updating response types in
16-
/// <see cref="ProducesResponseTypeAttribute" /> and performing an expansion for secondary and relationship endpoints (eg
17-
/// /article/{id}/{relationshipName} -> /article/{id}/author, /article/{id}/revisions, etc).
16+
/// <see cref="ProducesResponseTypeAttribute" /> and performing an expansion for secondary and relationship endpoints. For example:
17+
/// <code><![CDATA[
18+
/// /article/{id}/{relationshipName} -> /article/{id}/author, /article/{id}/revisions, etc.
19+
/// ]]></code>
1820
/// </summary>
1921
internal sealed class JsonApiActionDescriptorCollectionProvider : IActionDescriptorCollectionProvider
2022
{
@@ -163,30 +165,16 @@ private static void UpdateBodyParameterDescriptor(ActionDescriptor endpoint, Typ
163165

164166
private static ActionDescriptor Clone(ActionDescriptor descriptor)
165167
{
166-
var clone = (ActionDescriptor)descriptor.MemberwiseClone();
167-
168-
clone.AttributeRouteInfo = (AttributeRouteInfo)descriptor.AttributeRouteInfo!.MemberwiseClone();
169-
170-
clone.FilterDescriptors = new List<FilterDescriptor>();
171-
172-
foreach (FilterDescriptor filter in descriptor.FilterDescriptors)
173-
{
174-
clone.FilterDescriptors.Add(Clone(filter));
175-
}
176-
177-
clone.Parameters = new List<ParameterDescriptor>();
178-
179-
foreach (ParameterDescriptor parameter in descriptor.Parameters)
180-
{
181-
clone.Parameters.Add((ParameterDescriptor)parameter.MemberwiseClone());
182-
}
183-
168+
ActionDescriptor clone = descriptor.MemberwiseClone();
169+
clone.AttributeRouteInfo = descriptor.AttributeRouteInfo!.MemberwiseClone();
170+
clone.FilterDescriptors = descriptor.FilterDescriptors.Select(Clone).ToList();
171+
clone.Parameters = descriptor.Parameters.Select(parameter => parameter.MemberwiseClone()).ToList();
184172
return clone;
185173
}
186174

187175
private static FilterDescriptor Clone(FilterDescriptor descriptor)
188176
{
189-
var clone = (IFilterMetadata)descriptor.Filter.MemberwiseClone();
177+
IFilterMetadata clone = descriptor.Filter.MemberwiseClone();
190178

191179
return new FilterDescriptor(clone, descriptor.Scope)
192180
{

src/JsonApiDotNetCore.OpenApi/ObjectExtensions.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,11 @@ internal static class ObjectExtensions
88
new(() => typeof(object).GetMethod(nameof(MemberwiseClone), BindingFlags.Instance | BindingFlags.NonPublic)!,
99
LazyThreadSafetyMode.ExecutionAndPublication);
1010

11-
public static object MemberwiseClone(this object source)
11+
public static T MemberwiseClone<T>(this T source)
12+
where T : class
1213
{
1314
ArgumentGuard.NotNull(source);
1415

15-
return MemberwiseCloneMethod.Value.Invoke(source, null)!;
16+
return (T)MemberwiseCloneMethod.Value.Invoke(source, null)!;
1617
}
1718
}

0 commit comments

Comments
 (0)