Skip to content

Commit 417258d

Browse files
CopilotStefH
andcommitted
Refactor TryRebuildMemberInitExpression to use out parameter pattern
Agent-Logs-Url: https://github.com/zzzprojects/System.Linq.Dynamic.Core/sessions/537f61ea-9dbe-4ae4-9fa8-0358f826f195 Co-authored-by: StefH <249938+StefH@users.noreply.github.com>
1 parent ed2ebb4 commit 417258d

File tree

1 file changed

+14
-11
lines changed

1 file changed

+14
-11
lines changed

src/System.Linq.Dynamic.Core/Parser/ExpressionParser.cs

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1681,37 +1681,40 @@ private Expression CreateNewExpression(List<DynamicProperty> properties, List<Ex
16811681
// Call Promote and if that returns null, try to rebuild a nested MemberInitExpression for the target type,
16821682
// and if that also fails, try to convert the expression to the destination type using Expression.Convert.
16831683
var promoted = _parsingConfig.ExpressionPromoter.Promote(expressions[i], propertyOrFieldType, true, true);
1684-
if (promoted == null && expressions[i] is MemberInitExpression memberInitExpression)
1684+
if (promoted == null && expressions[i] is MemberInitExpression memberInitExpression &&
1685+
TryRebuildMemberInitExpression(memberInitExpression, propertyOrFieldType, out var rebuilt))
16851686
{
1686-
promoted = TryRebuildMemberInitExpression(memberInitExpression, propertyOrFieldType);
1687+
promoted = rebuilt;
16871688
}
16881689
memberBindings[i] = Expression.Bind(memberInfo, promoted ?? Expression.Convert(expressions[i], propertyOrFieldType));
16891690
}
16901691

16911692
return Expression.MemberInit(Expression.New(type), memberBindings);
16921693
}
16931694

1694-
private static Expression? TryRebuildMemberInitExpression(MemberInitExpression memberInitExpression, Type targetType)
1695+
private static bool TryRebuildMemberInitExpression(MemberInitExpression memberInitExpression, Type targetType, [NotNullWhen(true)] out Expression? expression)
16951696
{
1697+
expression = null;
1698+
16961699
var defaultConstructor = targetType.GetConstructor(Type.EmptyTypes);
16971700
if (defaultConstructor == null)
16981701
{
1699-
return null;
1702+
return false;
17001703
}
17011704

17021705
var newBindings = new MemberBinding[memberInitExpression.Bindings.Count];
17031706
for (var i = 0; i < memberInitExpression.Bindings.Count; i++)
17041707
{
17051708
if (memberInitExpression.Bindings[i] is not MemberAssignment assignment)
17061709
{
1707-
return null;
1710+
return false;
17081711
}
17091712

17101713
var memberName = assignment.Member.Name;
17111714
MemberInfo? targetMember = targetType.GetProperty(memberName) ?? (MemberInfo?)targetType.GetField(memberName);
17121715
if (targetMember == null)
17131716
{
1714-
return null;
1717+
return false;
17151718
}
17161719

17171720
var targetMemberType = targetMember is PropertyInfo targetPropertyInfo
@@ -1721,12 +1724,11 @@ private Expression CreateNewExpression(List<DynamicProperty> properties, List<Ex
17211724
var bindingExpression = assignment.Expression;
17221725
if (bindingExpression is MemberInitExpression nestedMemberInit && bindingExpression.Type != targetMemberType)
17231726
{
1724-
var rebuilt = TryRebuildMemberInitExpression(nestedMemberInit, targetMemberType);
1725-
if (rebuilt == null)
1727+
if (!TryRebuildMemberInitExpression(nestedMemberInit, targetMemberType, out var rebuiltNested))
17261728
{
1727-
return null;
1729+
return false;
17281730
}
1729-
bindingExpression = rebuilt;
1731+
bindingExpression = rebuiltNested;
17301732
}
17311733
else if (bindingExpression.Type != targetMemberType)
17321734
{
@@ -1736,7 +1738,8 @@ private Expression CreateNewExpression(List<DynamicProperty> properties, List<Ex
17361738
newBindings[i] = Expression.Bind(targetMember, bindingExpression);
17371739
}
17381740

1739-
return Expression.MemberInit(Expression.New(targetType), newBindings);
1741+
expression = Expression.MemberInit(Expression.New(targetType), newBindings);
1742+
return true;
17401743
}
17411744

17421745
private Expression ParseLambdaInvocation(LambdaExpression lambda)

0 commit comments

Comments
 (0)