2016-01-05 5 views
-2

Je suis actuellement bloqué pour résoudre le problème de la construction d'un arbre d'expression qui valide plusieurs arguments d'un tableau.
Mais je ne peux pas utiliser Expression.Loop pour parcourir tous les éléments du tableau d'entrée. Parce que je ne sais pas comment convertir la variable count en int.
J'ai essayé d'utiliser ArrayAccess mais c'est plutôt compliqué.
Un grand merci.
Voici mon code:
Accès à l'index de tableau dans la boucle d'expression .net

//array stores temp input. inputCount is a dynamic value that got from the argument 
object[] inParams = new object[inputCount]; 
var breakLabel = Expression.Label("LoopBreak"); 
//input of parameters to pass in the expression 
ParameterExpression[] param = new ParameterExpression[inputCount]; 
      for (int i = 0; i < inputCount; i++) 
      {     
       param[i] = Expression.Parameter(inParams[i].GetType(), "randomname"); 
//count variable for indexer 
ParameterExpression count = Expression.Parameter(typeof(int), "count"); 
      } 
BlockExpression block2 = Expression.Block(
       new[] { count }, 
       Expression.Assign(count, Expression.Constant(0)), 
       Expression.Loop(
        Expression.IfThenElse(
          Expression.LessThan(count, Expression.Constant(param.Count())),        
          Expression.Block(
//Assign param[count] element from inParams[count] element 
           Expression.Assign(param[count], Expression.Constant(inParams[count])), 
           Expression.PostIncrementAssign(count) 
           ), 
          Expression.Break(breakLabel) 
        ), 
        breakLabel 
       ));      
+0

Pourriez-vous mettre en forme votre code? C'est vraiment difficile à lire – Domysee

+0

Malheureusement le code que vous avez fourni contient plusieurs références qui ne sont pas définies par ex. ltBool, contrôles, breakLabel entre autres. Voir les notes sur la fourniture d'un exemple minimal, complet et vérifiable. http://stackoverflow.com/help/mcve –

+0

Hm Je peux voir que le code est formaté. J'ai également édité pour enlever les mots inutiles. –

Répondre

0

Euh? Qu'est-ce qui est "compliqué" à propos de Expression.ArrayAccess? Tout ce dont vous avez besoin est Expression.Assign(Expression.ArrayAccess(array, index), value). Votre problème consiste à mélanger des tableaux d'exécution avec des tableaux de temps "build".

Vous ne voulez probablement pas utiliser Expression.Loop, puisque vous avez besoin d'itérer sur quelque chose qui n'est pas un tableau. Au lieu de cela, tout simplement construire un simple bloc d'expressions:

Expression.Block 
(
    param.Select 
    (
    (item, index) => 
    Expression.Assign(item, Expression.Constant(inParams[index])) 
) 
); 

Cela dit, je ne suis pas sûr de ce que vous essayez de faire « assigner » à un paramètre. Peut-être que vous essayez d'utiliser Expression.Variable à la place ou quelque chose?

+0

Merci, ça fonctionne comme un champion. –