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

本文关键字:值传 函数 动态 | 更新日期: 2023-09-27 18:31:27

我已经读过这个了,但这并不能满足我的需求。

我正在学习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]);
    )
}

然后像这样调用函数 - 以某种方式:

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

如果你有更好的写法,欢迎你,也许像JavaScript这样的东西:

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

我的一个问题是我需要传递可能不是字符串的值(键将永远是)。

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

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)
            });

几种方法可以获得此结果。

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

例如,你可以写

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

并根据需要传递任意数量的参数

我会试试这个...

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);
    )
}