2010-01-22 8 views
1

Je me demande si vous pouvez créer et modifier un arbre d'expression à partir d'un délégué existant.Transformer un délégué en arbre d'expression

Un peu comme

public void Foo() { 
    Console.WriteLine(1000); 
} 
.... 
Expression exp = Foo.GetExpression(); 
//Now do something what changes 1000 to 2000... 

Je voudrais désosser une méthode excisting allready.

Mon problème est que j'ai une construction comme celui-ci:

var acts = new Action[20]; 

for (int i = 0; i != 20; i++)   
    acts[i] =() => { Console.WriteLine(i); }; 

et par le # chemin C fonctionne tous les actes font la même chose (imprime 20). Mais je veux que que

acts[5]() 

imprimer 5

acts[11]() 

impressions 11 et ainsi de suite.

J'ai donc besoin de calculer 20 délégués différents et je me demande quelle est l'approche "sympa" pour le faire. Bien sûr, je pouvais écrire:

acts[0] =() => Console.WriteLine(0); 
acts[1] =() => Console.WriteLine(1); 
acts[2] =() => Console.WriteLine(2); 
acts[3] =() => Console.WriteLine(3); 
.... 

Mais ce n'est pas une bonne approche dans mon eyey ...

Répondre

2

Rewrite comme ceci:

for(int i = 0; i != 20; i++)   
{ 
    var x = i; 
    acts[i] =() => { Console.WriteLine(x); }; 
} 
+0

Cela aura le même problème. –

+0

Merci à vous deux! C'était ce que je voulais savoir :) – Rico

3

solution d'Anton est près droite, mais il copie la variable au mauvais moment. Vous voulez ceci:

for (int i = 0; i != 20; i++) 
{ 
    int tmp = i; 
    acts[i] =() => Console.WriteLine(tmp); 
} 

De cette façon, la capturé la variable est tmp plutôt que i - et alors qu'il n'y a qu'une seule variable i, dont la valeur change à chaque itération, vous obtenez une « nouvelle » variable tmp pour chaque itération .

Voir les articles de blog d'Eric Lippert sur le sujet (part 1, part 2) pour plus de détails.

(Pour répondre à la question initiale selon le titre - vous ne pouvez pas créer ici un arbre d'expression à partir d'un délégué - la seule arborescence d'expression que vous pouvez créer est celle qui appelle simplement le délégué original.)

+0

Ahh, complètement raté le point. Merci! –