diff --git a/src/NReco.LambdaParser.Tests/LambdaParserTests.cs b/src/NReco.LambdaParser.Tests/LambdaParserTests.cs index 6acc4ca..53ccd97 100644 --- a/src/NReco.LambdaParser.Tests/LambdaParserTests.cs +++ b/src/NReco.LambdaParser.Tests/LambdaParserTests.cs @@ -216,6 +216,32 @@ public void EvalCachePerf() { Console.WriteLine("10000 iterations: {0}", sw.Elapsed); } + [Fact] + public void MultiParameterFunc() + { + var lambdaParser = new LambdaParser(new OptionsParamsInvokeMethod()); + + var context = getContext(); + context["f"] = new Funcs(); + context["sum"] = new Func((p) => + { + if (p is ICollection collection) + { + return collection.Cast().Select(w => + { + decimal.TryParse(w?.ToString(), out var value); + return value; + })?.Sum() ?? 0; + } + + decimal.TryParse(p?.ToString(), out var value1); + return value1; + }); + + Assert.Equal(13M, + lambdaParser.Eval("sum(1,2,3) + sum(1) + f.sum(1,2,3)", context)); + } + public class TestBaseClass { @@ -295,5 +321,24 @@ public string Format(string format,params object[] args) } + + public class Funcs + { + public decimal sum(params object[] p) + { + if (p is ICollection collection) + { + return collection.Cast().Select(w => + { + decimal.TryParse(w?.ToString(), out var value); + return value; + })?.Sum() ?? 0; + } + + return 0; + } + } + + } } diff --git a/src/NReco.LambdaParser/Linq/LambdaParameterWrapper.cs b/src/NReco.LambdaParser/Linq/LambdaParameterWrapper.cs index bff558b..d8a3ebc 100644 --- a/src/NReco.LambdaParser/Linq/LambdaParameterWrapper.cs +++ b/src/NReco.LambdaParser/Linq/LambdaParameterWrapper.cs @@ -104,6 +104,19 @@ public LambdaParameterWrapper InvokeDelegate(object obj, object[] args) { var deleg = (Delegate)obj; var delegParams = deleg.GetMethodInfo().GetParameters(); + + // If it is a parameter and the parameter type is object (如果是一个参数 并且 参数类型是 object) + var isParams = delegParams.Length == 1 && + delegParams[0].ParameterType == typeof(object) && + delegParams.Length != args.Length; + if (isParams) + { + var resolvedArgList = args + .Select(w => w is LambdaParameterWrapper ? ((LambdaParameterWrapper)w).Value : w) + .ToArray(); + return new LambdaParameterWrapper(deleg.DynamicInvoke((object)resolvedArgList), Ctx); + } + if (delegParams.Length != args.Length) throw new TargetParameterCountException( String.Format("Target delegate expects {0} parameters", delegParams.Length));