将列表成员传递给函数

时间:2012-01-11 02:02:34

标签: c# list

如何将值列表传递给函数,其中值已存储在列表中且每次函数都不相同?

为了解释,我有一个列表,列出了几种不同类型的自定义对象(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]);
}

然而,这(显然)是非常笨重的代码,我想不惜一切代价避免它。我的问题有其他解决方案吗?我知道这真的令人困惑,但我尽力解释它。如果您对我正在尝试做的事情感到困惑,请告诉我。

不,这不是一个家庭作业问题。 ;)

3 个答案:

答案 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属性。

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