Пример #1
0
 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))));
         }
     }
 }
Пример #2
0
        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);
        }