如何将值列表传递给函数,其中值已存储在列表中且每次函数都不相同?
为了解释,我有一个列表,列出了几种不同类型的自定义对象(A List<object>
以使其工作),我想将这些对象传递给一个函数。但是,功能并不总是相同的。我可以有几个不同的函数,并且假设List的内容总是匹配函数的输入变量,我希望能够将列表的内容传递给我的函数。
下面的代码是一个可行的例子,但是对于一个缺陷:
List<object> myListOfVariables = new List<object>();
myListOfVariables.Add("Hello, world!");
myListOfVariables.Add(10);
void SayHelloXTimes(string helloString, int x) {
for(int i = 0;i<x;i++) {
print(helloString)
}
}
SayHelloXTimes(myListOfVariables[0], myListOfVariables[1]);
现在,因为我知道我的列表将始终在正确的位置包含适量的变量,如果我只有一个函数,那将会有效。但问题是,我需要扩展这个,所以我可以拆开我的列表并将其传递给具有不同数量参数的函数。
由于其他原因,我知道我的列表总是在正确的位置有适量的变量,所以我们不需要担心。我也知道将值传递给我需要的函数的名称。我想我可以根据列表的长度加载if
语句,如下所示:
if (myListOfVariables.Length == 2) {
SayHelloXTimes(myListOfVariables[0], myListOfVariables[1]);
}
else if (myListOfVariables.Length == 3) {
SayHelloXTimesForY(myListOfVariables[0], myListOfVariables[1], myListOfVariables[2]);
}
然而,这(显然)是非常笨重的代码,我想不惜一切代价避免它。我的问题有其他解决方案吗?我知道这真的令人困惑,但我尽力解释它。如果您对我正在尝试做的事情感到困惑,请告诉我。
不,这不是一个家庭作业问题。 ;)
答案 0 :(得分:1)
我认为你想做的事情可以用反射来完成。请查看 MethodBase.Invoke Method
您所要做的就是按照函数期望的顺序将所有参数添加到对象数组中。
class Program
{
public static void SayHelloXTimes(string helloString, int x)
{
for (int i = 0; i < x; i++)
{
Console.WriteLine(helloString);
}
}
static void Main(string[] args)
{
MethodInfo Method = typeof(Program).GetMethod("SayHelloXTimes");
Method.Invoke(null, new object[] { "foo", 3 });
Console.ReadLine();
}
}
答案 1 :(得分:0)
您想要params:
void SayHelloXTimes(params string[] list) {
for(int i = 0;i<list.Length;i++) {
print(list[i])
}
}
SayHelloXTimes("Hi", "Hi", "Hi"); // legal
SayHelloXTimes("Hi"); // legal
SayHelloXTimes("Hi", "Hi", "Hi", "Hi", "Hi", "Hi"); // still legal
答案 2 :(得分:0)
如果这是我的应用程序,我会创建一个参数类来保存列表值。
您可以将列表传递给类的构造函数,并将其提取到类本地属性中(因为您知道位置),或者您可以直接从列表中将值公开为readonly属性。
然后,您只需将参数类的实例传递给每个方法,而不必担心方法的参数数量。