You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: src/DryIoc/Container.cs
+12-8
Original file line number
Diff line number
Diff line change
@@ -3013,22 +3013,25 @@ i.Expression is ConstantExpression cd &&
3013
3013
return TryInterpret(r, f.Body, paramExprs, paramValues, parentArgs, useFec, out result);
3014
3014
3015
3015
#if !SUPPORTS_DELEGATE_METHOD
3016
-
return false;
3016
+
return false;
3017
3017
#else
3018
-
if (!TryInterpret(r, delegateExpr, paramExprs, paramValues, parentArgs, useFec, out var delegateObj))
3018
+
if (!TryInterpret(r, delegateExpr, paramExprs, paramValues, parentArgs, useFec, out var delegateObj)) // todo: @perf avoid calling the TryInterpret for the known constant of FactoryDelegate
3019
3019
return false;
3020
3020
3021
3021
var lambda = (Delegate)delegateObj;
3022
-
var argExprs = invokeExpr.Arguments.ToListOrSelf();
3022
+
var argExprs = invokeExpr.Arguments.ToListOrSelf(); // todo: @perf recognize the OneArgumentInvocationExpression
3023
3023
if (argExprs.Count == 0)
3024
3024
result = lambda.GetMethodInfo().Invoke(lambda.Target, ArrayTools.Empty<object>());
3025
3025
else
3026
3026
{
3027
-
var args = new object[argExprs.Count];
3027
+
var args = new object[argExprs.Count]; // todo: @perf avoid allocating for the single argument
3028
3028
for (var i = 0; i < args.Length; i++)
3029
-
if (!TryInterpret(r, argExprs[i], paramExprs, paramValues, parentArgs, useFec, out args[i]))
3029
+
if (!TryInterpret(r, argExprs[i], paramExprs, paramValues, parentArgs, useFec, out args[i])) // todo: @perf simplify for the single argument `r` of ResolverContext for FactoryDelegate
3030
3030
return false;
3031
-
result = lambda.GetMethodInfo().Invoke(lambda.Target, args);
3031
+
if (lambda is FactoryDelegate fd)
3032
+
result = fd.Invoke((IResolverContext)args[0]);
3033
+
else
3034
+
result = lambda.GetMethodInfo().Invoke(lambda.Target, args);
Copy file name to clipboardExpand all lines: test/DryIoc.IssuesTests/GHIssue233_Add_RegisterDelegate_with_parameters_returning_object_for_the_requested_runtime_known_service_type.cs
0 commit comments