2010-07-30 8 views
27

Je construis un arbre d'expression LINQ mais il ne compilera pas parce que prétendument la variable locale $var1 est hors de portée:Construire un arbre d'expression LINQ: comment obtenir la variable portée

variable « » de type 'System.Object' référencé du champ d'application '', mais il ne se définit pas

Ceci est l'arbre d'expression:

.Block() { 
    $var1; 
    .If ($n.Property1 == null) { 
     .Block() { 
      $var1 = null; 
      .Return #Label1 { } 
     } 
    } .Else { 
     .Default(System.Void) 
    }; 
    $var1 = (System.Object)($n.Property1).Length; 
    .Label 
    .LabelTarget #Label1:; 
    $var1 
} 

Le code suivant est responsable de la construction de l'arbre. Cela fait partie de quelque chose de plus grand, donc je ne m'attends pas à ce que son but soit parfaitement clair à partir de cet exemple. Donc, la question est: comment puis-je obtenir la variable locale dans la portée de sorte que l'expression compile avec succès?

Répondre

42

Your'e ajouter la Expression.Variable à la liste des expressions "normales" dans le bloc - vous devez use the overload which specifies the variables do declare for the block separately:

Expression finalExpression = Expression.Block(new[] { resultVariable }, 
               expressions); 

(et supprimer l'appel à expressions.Add(resultVariable);)

+0

Merci Jon, qui a fonctionné! La résolution de cette question a révélé un deuxième problème assez similaire. L'affectation de la variable sourceExpression lance le compilateur d'expression throw: "variable 'n' de type 'TestClass' référencé par scope '', mais il n'est pas défini" –

+0

J'ai pu résoudre ce problème, merci encore. –

+1

Merci encore de m'avoir aidé. La question était étroitement liée à un article de blog que j'écrivais à http://blog.subspace.nl/post/Getting-rid-of-null-checks-in-property-chains.aspx, qui pourrait vous intéresser. –