2013-03-06 86 views
1

难以给出正确的标题,对此感到抱歉。将数组转换为单个元素传递给函数

我有一个类(我不能修改)具有功能

f(string arg1, string arg2, ..., string n)

我有一个数组var arr = new string[n] { ..... }

我怎么能转换阵列项目FO功能f传递,而不需要写

f(arr[0], arr[1], ..., arr[n-1])

+0

您应该可以使用反射,例如 – Esailija 2013-03-06 12:55:32

+0

N是如何指定的?我的意思是,它不可能是动态的,因为你有一个具有N个参数的函数? – ken2k 2013-03-06 12:56:33

+0

@Esailija:好的,我可以,但是使用Reflection编写函数比手动编写参数困难。当然,如果他们是少数(我有20) – Marco 2013-03-06 12:57:05

回答

3

您可能会考虑使用反射。

在这种情况下,调用鸥有可能传递参数数组:

methodInfo.Invoke(instanceOfClass, parametersArray) 

可以看一下例子:

Reflection: How to Invoke Method with parameters

保持atention的事实是,在这个 case根据MethodBase.Invoke文档你有一个object[]数组,所以你必须处理boxing/unboxing,不知道这一切努力真的值得,只是简单地通过参数,以平常的方式。

+0

我没有想到这件事,你是对的。我会在几个小时内看看它,然后回到你身边。谢谢! – Marco 2013-03-06 13:01:26

+0

在我的具体情况下,它可能不值得(参数是20),但只是有一个想法,如果我需要更长的时间。我关心的是代码的可读性:写下'arr [0],....,arr [19]'并不好笑,也不可维护......你怎么看? – Marco 2013-03-06 13:03:45

+0

@Marco:好吧,如果唯一的conern是*可读性*和* scallability *它值得去看看这个解决方案。在其他情况下,只要保持一贯的做事方式。 – Tigran 2013-03-06 13:05:26

2

你可能会使用反射,但我认为这会比完全写入的20个参数更难看。

如果你只需要它在一个位置,我会说只是用20个参数调用它。如果您需要在多个地方使用它,请在您自己的程序中使用20个参数创建一个函数,并在您需要的任何地方在您自己的程序中调用该函数。

+0

我喜欢这个回答,+1 – ken2k 2013-03-06 12:58:58

+0

好点,谢谢! – Marco 2013-03-06 13:08:33

0

使用诸如MethodInfo等反射将是您的选择之一。

[1]获取方法F的信息(伪代码):

MethodInfo[] methodInfos = typeof (TheClassWhereFuncfExists).GetMethods(BindingFlags.Public...); 

[2]使用LINQ获得F公司的方法信息

MethodInfo fmi= methodInfos.Where(item=> item.Name=="f").FirstOrDefault(); 

[3]一旦你的FMI,你可以通过编程的方式调用它:

fmi.Invoke(...) 

伪代码只,未经过彻底测试。

相关问题