2010-01-22 118 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

啊,完全错过了这一点。谢谢! –

相关问题