如何将一对动态键/值传递给函数?

时间:2014-11-22 15:58:57

标签: c# unity3d parameter-passing

我已经阅读了thisthis,但这并不符合我的需求。

我正在学习Csharp,这是我的第一个功能之一:

public void AskServer(string URL, WWWForm form)
{
    WWWForm form = new WWWForm(URL);
    form.AddField("step", StateManager.STEP_GET_CONF);
    form.AddField("pseudo", this._pseudo);
    form.AddField("jeton", this._dernierJeton.ToString());
    /*... a bit more out of scope code...*/ 
}

我想做一个(更多)通用的东西:

public void AskServer(string URL, ...)
{
    WWWForm form = new WWWForm(URL);
    /* do a loop on all parameters following the first one */
    for (/*dont know how to write this*/) {
        form.AddField(param[i], param[i+1]);
    )
}

然后调用函数-somehow-就像:

AskServer("http://myweb", "pseudo", this._pseudo, "jeton", this._jeton);

也许如果你有更好的写作方式,欢迎你,也许像JavaScript一样:

AskServer("http://myweb", {
    "pseudo": this._pseudo,
    "jeton": this._jeton
});

我的一个问题是我需要传递可能不是字符串的值(键总是这样)。

3 个答案:

答案 0 :(得分:2)

params关键字允许您指定可变数量的参数(必须是最后一个参数)。然后,您可以将其视为数组。

public void AskServer(string url, params object[] args)
{
    WWWForm form = new WWWForm(url);

    for (int i = 0; i < args.GetLength(0); i++)
        form.Addfield(args[i].ToString(), args[++i]);
}

被称为,

AskServer("http://myweb", "pseudo", 1, "jeton", 234);

或者作为替代方法,在密钥上使用列表而不是强类型(通用声明很难看,因此您可以在命名空间中对其进行别名)

using Kvp = System.Collections.Generic.KeyValuePair<string, object>;

....

public void AskServer(string url, List<Kvp> kvps)
{
    WWWForm form = new WWWForm(url);

    foreach (var arg in kvps)            
        form.Addfield(arg.Key, arg.Value);            
}

被称为:

AskServer("http://myweb",
            new List<Kvp>() {
                new Kvp("pseudo", 1),
                new Kvp("jeton", 234)
            });

答案 1 :(得分:0)

有几种方法可以获得这个结果。

参数数组,元组,匿名类型,......

例如,你可以写

public void AskServer(string URL, params object[] values)
{
 ...
}

并传递任意数量的参数

答案 2 :(得分:0)

我会尝试这个......

public void AskServer(string url, KeyValuePair<string, object>[] parameters)
{
    WWWForm form = new WWWForm(URL);
    /* do a loop on all parameters following the first one */
    for (/*dont know how to write this*/) {
        form.AddField(parameters[i].Key, parameters[i].Value);
    )
}