是否可以将列表的元素作为C#中一个函数调用的参数传递?

时间:2017-06-07 19:34:59

标签: c# list function dll parameter-passing

我正在编写一个旨在与在线游戏互动的机器人。我正在使用一个名为“Send”的函数,其定义如下:

public void Send(string type, params object[] parameters);

由于params关键字,“发送”是一个可以包含可变数量参数的函数。如果我将这些参数存储在List<object>中,我是否可以将此参数列表传递给函数,而不必为每个可能数量的参数编写不同的代码?

我知道如果那个params关键字不存在,我可以使用List<T>.ToArray()将整个列表作为一个参数传递,但是发送函数是在预备文件库中定义的,我不能改变。

2 个答案:

答案 0 :(得分:2)

小解释:

var myList = new List<object>() { 1, "foo", "bar"};

Send(type, myList.ToArray());         //this will invoke: void Send(string, object, object, object);
Send(type, (object)myList.ToArray()); //this will invoke: void Send(string, object);
Send(type, myList);                   //this will invoke: void Send(string, object);

因此,如果您希望列表被视为参数 - 您可以调用ToArray(),如果您希望将其视为单个参数 - 只需将其转换为反对。

答案 1 :(得分:0)

  

但是Send函数是在预制备的库中定义的,我无法改变。

您可以定义扩展方法

// Where Lib is the type that contains the Send method.
public static class MyExtensions
{
    public static void Send(this Lib lib, string type, int obj)
    {
        lib.Send(type, obj);
    }

    public static void Send(this Lib lib, string type, List<object> objs)
    {
        lib.Send(type, objs.ToArray());
    }

    // Other overloads
}

然后你就像使用它一样构建到库中来使用它,

var lib = new Lib();
lib.Send(type, 1) // Call Send(this Lib lib, string type, int obj)