2010-01-22 168 views
1

不知您是否可以從現有委託中創建和修改表達式樹。將委託轉換爲表達式樹

有點像

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

所以我想反向工程媒體鏈接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

啊,完全錯過了這一點。謝謝! –

相關問題