将列表成员传递到函数中
本文关键字:函数 列表 成员 | 更新日期: 2023-09-27 18:20:08
如果值已经存储在列表中,而函数每次都不一样,我该如何将值列表传递到函数中?
为了解释这一点,我列出了几种不同类型的自定义对象(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]);
}
然而,这(显然)是非常笨拙的代码,我想不惜一切代价避免它。我的问题还有别的解决办法吗?我知道这真的很令人困惑,但我已经尽力解释了。如果你仍然对我想做什么感到困惑,请告诉我。
不,这不是家庭作业问题。)
我认为您想要做的事情可以使用反射来完成。查看MethodBase.Invoke方法
您所要做的就是按照函数期望的顺序将所有参数添加到对象数组中。
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();
}
}
您需要参数:
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
如果这是我的应用程序,我会创建一个参数类来保存列表值。
您可以将列表传递到类的构造函数中,然后将其提取到类的本地属性中(因为您知道位置),或者直接从列表中将值公开为只读属性。
然后,您可以将参数类的一个实例传递给每个方法,而不必担心方法的参数数量。