2015-11-09 135 views
0

我有接受与喜欢的签名的操作方法:如何从Action中获取参数?

public void DoSomething(Action code); 

然后我会调用该方法,如:

DoSomething(()=> CallSomething("A","B","C"); 

在DoSomething的方法,我怎么能得到的参数值?

另一个要考虑的是,CallSomething可潜在具有可选参数,这意味着我不能只是改变的DoSomething的签名 - >Expression<Action>

所有我需要做的就是参数值,我对任何可以工作的方法都感兴趣。

我已经尝试创建一个新方法,它接受Expression<Action>然后通过(从DoSomething)传递动作,但参数未填充。

欢迎任何建议。

+0

我不认为这会很简单,因为在'DoSomething'函数中,'code'只是某种函数指针;你并不总是知道这是一个调用另一个函数的lambda函数。我觉得你不得不使用Reflection来反汇编lambda并寻找函数调用,但即使如此,你仍然在做一些相当棘手的事情。 –

+0

为什么?你想做什么,为什么你认为采取“行动”(或“表达式')的方法是做到这一点的方法?为什么'Expression '阻止您使用可选参数? – Luaan

回答

3

点是你不想

您的方法接受Action委托。它的意思是“我只想要召唤那些没有参数并且没有任何价值的东西”。

如果您需要将参数传递给函数,请使用其他委托,或直接将它们作为参数传递。

想想这个没有 the lambda。你有一个接口有一个方法,Act不接受任何参数并且不返回任何值。

DoSomething(IMyInterface myInterface) 
{ 
    myInterface.Act(); // How do I get the arguments of some method that `Act` calls? 
} 

这是否有任何意义?您是否希望能够反汇编在myInterface中通过的所有实例,找到它的Act方法,检查从那里调用的所有方法并拦截它们的参数?代表几乎没有一个单一方法的接口,只有一个状态继续。

如果您需要参数,使它们成为公共接口的一部分。否则,你的抽象没有任何意义,你不应该使用它。没有人强迫你使用lambdas,没有人是强制你传递一个lambda并且没有参数,没有人是强制特别是你使用Action。他们都是简单的工具 - 如果他们不适合你的任务,不要使用他们

要更直接回答你的问题:你得到的参数作为任何其他参数。问题是你的行动没有参数

+0

你能给我可怜的芒版吗? I.e:我正在传递可以正确执行的代码?因为它可以被执行,所以在某些时候理解参数。我怎么能得到这些论据? –

+0

@JL。你没有传递*代码* - 你正在传递一个接口。当然,实现该接口的类确实有代码,但是在调用DoSomething方法时已经编译了代码。即使通过反思,也没有办法达到C#代码 - 你可以做的最好的办法是以某种方式解释IL代码。也许他们甚至不再有争论(例如,呼叫可能已被内联)!如果您需要检查逻辑代码,请使用'Expression '。即便如此,以任何有意义的方式解释数据也是非常困难的。 *你想做什么*? – Luaan