将列表成员传递到函数中

本文关键字:函数 列表 成员 | 更新日期: 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

如果这是我的应用程序,我会创建一个参数类来保存列表值。

您可以将列表传递到类的构造函数中,然后将其提取到类的本地属性中(因为您知道位置),或者直接从列表中将值公开为只读属性。

然后,您可以将参数类的一个实例传递给每个方法,而不必担心方法的参数数量。