2010-01-22 2 views
1

Интересно, можете ли вы создать и изменить Дерево выражений из существующего делегата.Преобразование делегата в дерево выражений

Любопытное нравится

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

Так что я хотел бы обратить инженер Allready excisting метод.

Моя проблема заключается в том, что у меня есть строительство, как это:

var acts = new Action[20]; 

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

и по пути C# работает все действия, сделать то же самое (печатает 20). Но я хочу, чтобы что

acts[5]() 

печати 5

acts[11]() 

печатает 11 и так далее.

Так что мне нужно вычислить 20 разных делегатов, и мне интересно, что такое «хороший» подход. Конечно, я мог бы просто написать:

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

Но это не хороший подход, в моем eyey ...

ответ

2

переписать так:

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

Это будет иметь ту же проблему. –

+0

Спасибо вам обоим! Это то, что я хотел знать :) – Rico

3

решение Антона является почти право, но он копирует переменную в неподходящее время. Вы хотите:

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

Таким образом захвачена переменная является tmp, а не i - и в то время как есть только одна i переменная, значение которой меняется на каждой итерации, вы получаете «новый» tmp переменную для каждой итерации ,

Просмотреть записи пользователя Eric Lippert по этой теме (part 1, part 2) для получения более подробной информации.

(Чтобы ответить на исходный вопрос в соответствии с заголовком - вы не можете создать дерево выражений из делегата полезным образом - единственное дерево выражений, которое вы можете создать, - это тот, который просто вызывает исходный делегат.)

+0

Ahh, полностью упустил точку. Благодаря! –

Смежные вопросы