private IEnumerable <object> ConvertInitializers(ArgumentListToken arguments, List <ParameterExpression> parameters, Dictionary <string, ConstantExpression> locals, List <DataContainer> dataContainers, Type dynamicContext, Type[] expectedTypes, LabelTarget label) { foreach (TokenBase token in arguments.Arguments) { if (token is ArgumentListToken) { MethodInfo add = Constructor.DeclaringType.GetMethods(BindingFlags.Public | BindingFlags.Instance).FirstOrDefault(m => m.Name == "Add" && m.GetParameters().Length == (token as ArgumentListToken).Arguments.Length); int i = 0; Expression[] exps = new Expression[add.GetParameters().Length]; foreach (ParameterInfo info in add.GetParameters()) { CallSiteBinder binder = Binder.Convert(CSharpBinderFlags.None, info.ParameterType, dynamicContext); exps[i] = Expression.Dynamic(binder, info.ParameterType, (token as ArgumentListToken).Arguments[i++].GetExpression(parameters, locals, dataContainers, dynamicContext, label)); } yield return(Expression.ElementInit(add, exps)); } else { MethodInfo add = Constructor.DeclaringType.GetMethods(BindingFlags.Public | BindingFlags.Instance).FirstOrDefault(m => m.Name == "Add" && m.GetParameters().Length == 1); CallSiteBinder binder = Binder.Convert(CSharpBinderFlags.None, add.GetParameters()[0].ParameterType, dynamicContext); yield return(Expression.ElementInit(add, Expression.Dynamic(binder, add.GetParameters()[0].ParameterType, token.GetExpression(parameters, locals, dataContainers, dynamicContext, label)))); } } }
internal override bool TryGetToken(ref string text, out TokenBase token, bool requireReturnValue = true) { token = null; var list = new List <TokenBase>(); List <string> split; string temp = text; if (!TrySplitByCommas(ref temp, open, close, out split)) { return(false); } foreach (string str in split) { TokenBase newToken; string s = str.Trim(); if (allowSubLists && s.StartsWith(open.ToString()) && s.EndsWith(close.ToString())) { if (new ArgumentListToken(open, close).TryGetToken(ref s, out newToken)) { list.Add(newToken); } else { return(false); } } else if (findAssignments) { if (new LambdaAssignmentToken(assignmentType).TryGetToken(ref s, out newToken)) { list.Add(newToken); } else { return(false); } } else if (allowTypeCasts) { if (new TypeCastToken(false).TryGetToken(ref s, out newToken)) { string nameTemp = "$" + s; TokenBase tokenTemp; if (!new ParameterToken().TryGetToken(ref nameTemp, out tokenTemp) || !String.IsNullOrWhiteSpace(nameTemp)) { return(false); } (newToken as TypeCastToken).Target = tokenTemp; list.Add(newToken); } else { string nameTemp = "$" + s; TokenBase tokenTemp; if (!new ParameterToken().TryGetToken(ref nameTemp, out tokenTemp) || !String.IsNullOrWhiteSpace(nameTemp)) { return(false); } list.Add(tokenTemp); } } else { if (EquationTokenizer.TryEvaluateExpression(str.Trim(), out newToken)) { list.Add(newToken); } else { return(false); } } } token = new ArgumentListToken('\0', '\0') { Arguments = list.ToArray() }; text = temp; return(true); }