【问题标题】:How to pass a dynamic pair of key/values to a function?如何将一对动态键/值传递给函数?
【发布时间】:2015-01-20 15:51:02
【问题描述】:

我已经阅读了 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]);
    )
}

然后以某种方式调用函数:

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

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

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

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

【问题讨论】:

    标签: c# unity3d parameter-passing


    【解决方案1】:

    我会试试这个...

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

    【讨论】:

      【解决方案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)
                  });
      

      【讨论】:

      • 非常感谢您的详细解释,因为我没有说,但这也是我需要的东西:详细的解决方案。
      【解决方案3】:

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

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

      例如你可以写

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

      并传递任意数量的参数

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-06
        • 2023-02-17
        • 1970-01-01
        • 2012-02-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多